指导单元测试REST调用在控制器返回一个承诺(Guidance on unit testing RE

2019-10-21 02:10发布

我能够测试 - $ scope.dvModel = DienstverlenerDetailService.query(); - 相应。 我无法弄清楚如何测试注释掉线。 当然你可以使用上的一些指导。

angular.module('dvb.controllers').controller('ServiceFacilitatorEditController', ['$scope', 'DienstverlenerDetailService', function(

    $scope, 
    DienstverlenerDetailService) {
    'use strict';

    $scope.dvModel = DienstverlenerDetailService.query();

    /*DienstverlenerDetailService.query().$promise.then(
        function(response) {
            $scope.dvModel = response.data;
        },
        function(error) {   

        }
    );*/
}]);



describe('serviceFacilitatorEditController', function() {
    'use strict';

    beforeEach(module('dvb.ui'));

    var scope, ctrl, fact, json, $rootScope, $compile, $controller, $injector;

    beforeEach(function() {
        inject(function(_$rootScope_, _$compile_, _$controller_, _$injector_) {
            $rootScope = _$rootScope_;
            $compile = _$compile_;
            $controller = _$controller_;
            $injector = _$injector_;
        });

        jasmine.getFixtures().fixturesPath = 'base/src/main/webapp/stubs/';
        var f = readFixtures('servicefacilitator_0');
        json = JSON.parse(f);

        scope = $rootScope.$new();

        var DienstverlenerDetailService = { query: function() {} };
        spyOn(DienstverlenerDetailService, 'query').and.returnValue(json);
        ctrl = $controller('ServiceFacilitatorEditController', {
            $scope: scope,
            DienstverlenerDetailService: DienstverlenerDetailService
        });
    });

    it('it should....', function() {
        expect(scope.dvModel.data).toBe(json.data);
    });
});

在)一对夫妇的其他职位,其中使用$ Q,$ rootscope.apply(和/或其他东西来解决的承诺看,但我似乎无法把它粘起来。 我掌握的概念,但还是觉得奇怪的是,这1条单行能够完全测试,但其他符号心不是。

我问这个的主要原因是:1 - 我想明白了2 - 我不能只是把$ scope.vdModel的承诺,我需要什么数据属性包装内。

Answer 1:

当你窥视DienstverlenerDetailServicequery方法。 返回与属性的对象$promise与价值的承诺,你可以使用$q.when 。 注$q服务也是如此。

     spyOn(DienstverlenerDetailService, 'query').
                       and.returnValue({$promise:$q.when(json)});

而在你期望做到: -

it('it should....', function() {
    scope.$digest(); //<-- Apply digest for the promise to be resolved.
    expect(scope.dvModel.data).toBe(json.data); //<-- Now set the expectation
});

我想补充的,当你创建一个模拟的服务你也许可以做到在不同的是,以及(我一般喜欢),而不是建立在被窥探匿名函数,您可以用创建模拟对象jasmine.createSpyObj并添加任意数量的标准,您可能要测试的模拟方法。

  DienstverlenerDetailService = jasmine.createSpyObj('DienstverlenerDetailService', ['query']);

  DienstverlenerDetailService.query.and.returnValue({$promise:$q.when(json)});

同样,如果你有嘲笑其他方法,以及你可以这样做: -

 DienstverlenerDetailService = jasmine.createSpyObj('DienstverlenerDetailService', ['query', 'save', 'delete', ...etc]);

 //And set return value for specific methods...


文章来源: Guidance on unit testing REST call in controller returning a promise