简体   繁体   English

在angularjs控制器中对单元测试一个Promise调用有问题

[英]Having problems unit testing a promise call in angularjs controller

SupportedLanguagesServices get method returns a promise which is resolved in the controller as follows: SupportedLanguagesServices get方法返回一个promise ,该promise在控制器中如下解析:

    angular.module('App').controller('MyController', ['SupportedLanguagesService',
    function(SupportedLanguagesService) {

        var self = this;
        self.supportedLanguages = [];

        SupportedLanguagesService.get().success(
            function(response) {
                self.supportedLanguages = response;
        });

    }]);

And here is the test I wrote, but it is not working: 这是我编写的测试,但是没有用:

    describe('Controller: MyController', function() {

    beforeEach(module('App'));

    var rootScope, controller;

    beforeEach(inject(function($controller, $rootScope, SupportedLanguagesService, $q) {

        var deferred = $q.defer();
        deferred.resolve([{name:"English", code:"en"},{name:"Portugues", code:"pt_BR"]);
        spyOn(SupportedLanguagesService, 'get').andReturn(deferred.promise);

        rootScope = $rootScope;
        controller = $controller;
    }));

    it('should get SupportedLanguages', function() {
        rootScope.$digest();
        var ctrl = controller('MyController');
        expect(ctrl.supportedLanguages.length).toEqual(2);
    });

});

It throws an exception on the statement: var ctrl = controller('MyController'); 它在语句上引发异常: var ctrl = controller('MyController');

Thank you for your assistance. 谢谢您的帮助。

Intead of success (which is an $http callback), you can change to a then , which is available on all promises. success含义(这是$http回调),您可以更改为then ,所有promise都可用。 This will allow you to easily mock the promise (and not concern yourself with $httpBackend : 这将使您轻松地兑现承诺(而不必担心$httpBackend

    SupportedLanguagesService.get().then(
        function(response) {
            self.supportedLanguages = response.data;
    });

Then, you need to use the controller's constructor and then call a $digest . 然后,您需要使用控制器的构造函数, 然后调用$digest So, switching to this should get you there: 因此,切换到该选项应该可以帮助您:

it('should get SupportedLanguages', function() {

    var ctrl = controller('MyController');
    rootScope.$digest();
    expect(ctrl.supportedLanguages.length).toEqual(2);
});

You can also simplify the setup code using $q.when : 您还可以使用$q.when简化设置代码:

var response = [{name:"English", code:"en"},{name:"Portugues", code:"pt_BR"}];
spyOn(SupportedLanguagesService, 'get').andReturn($q.when(response));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM