0

この同じテスト内で使用できるように、Angular コントローラーをテストし、ファクトリをモックしようとしています。私はAngularのテストにかなり慣れていないので、その方法を理解するのに苦労しています。私の工場は、$q サービスではなく $http を使用せず、promise を返します。また、ファクトリの関数呼び出しがプロミスを返すことを考えると、モック ファクトリ内に何を配置すればよいかわかりません。

私の最終的な目標は、コントローラーからモック ファクトリを呼び出し、コントローラー内の 2 つの配列をチェックして、それらにデータを入力することになっているデータを確認することです。テスト容易性のためにテストを再構築するためのヒントがあれば、ぜひフィードバックをお寄せください。

角度コントローラー

    export class workListController {
      constructor(dataService, $q) {
        this.$q = $q;
        this.work = [];
        this.tasks = [];
        this.dataService = dataService;
        this.setup();
      }

      setup() {
        this.$q.all([this.dataService.getWorkItems(), this.dataService.getTasks()])
        .then(() => {
          this.work = this.dataService.getState().work;
          this.tasks = this.dataService.getState().tasks;
          this.dataService.addNumberOTasksToWork();
        });
      }

      tasksForWork(workId) {
        var workTasks = [];
        for (let task of this.tasks) {
          if (task.agf__Work__c === workId) {
            workTasks.push(task);
          }
        }
        return workTasks;
      };

    }

アンギュラーファクトリー

  const dataService = ($q) => {
    let work = [];
    let tasks = [];
    let connection = new Connection{/**/};

    return { getWorkItems, getTasks, addNumberOTasksToWork, getState};
    function queryWrapper(query) {
      var deferred = $q.defer();
      connection.query(query)
        .then(function(result) {
          deferred.resolve(result);
        }, function(error) {
          deferred.reject(error);
        });

      return deferred.promise;
    }


    function getWorkItems() {
      return queryWrapper(`SELECT Id, ......`)
       .then((data) => {
         //data looks like this: {totalSize: 3, done: true, records: [......]}
         work = data.records;
       });
    }

    function getTasks() {
      return queryWrapper(`SELECT Id,...`)
       .then((data) => {
         //data looks like this: {totalSize: 3, done: true, records: [......]}
         tasks = data.records;
       });
    }

    function addNumberOTasksToWork() {
      work.forEach((workItem) => {
        workItem.numberOfTasks = 0;
      });
      work.forEach((workItem) => {
        tasks.forEach((taskItem) => {
          if (taskItem.agf__Work__c === workItem.Id) {
            workItem.numberOfTasks++;
          }
        });
      });
    }

    function getState(){
      return {work,tasks};
    }

  };

  export {dataService};

テストファイル

  import {workList} from './work-list.module.js';
  import {workListDirective} from './work-list.directive.js';
  import template from './work-list.html';
  import {workListController} from './work-list.controller.js';

  describe('AA_TaskBoard -  workList', function () {
    let $scope;
    let $controller;
    let $httpBackend;
    let mockDataService;

    beforeEach(angular.mock.module(workList.name));
    //trying to mock factory
    beforeEach(angular.mock.module(function($provide) {
      $provide.value('dataService', mockDataService);
      mockDataService = {
        getWorkItems: function(){
          //this should return a promise, but unsure of what to put here
          return {

          };
        },
        getTasks: function(){
          return {

          };
        }
      };

    }));


    beforeEach(inject(function(_$rootScope_, _$controller_, _$httpBackend_) {
      $rootScope = _$rootScope_;
      $controller = _$controller_;
      $httpBackend = _$httpBackend_;
    }));





  });
4

0 に答える 0