我如何模拟服务通过done()和catch()回调在angularjs中返回承诺

时间:2019-05-01 14:44:31

标签: angularjs unit-testing jasmine

我想在angularjs中模拟用于单元测试的服务,

 TranslationService.translate(args)
                                    .then(function translated(value) {
                                        //somecode
                                        return;
                                    })
                                    .catch()
                                    .done();

遵循以下答案: How do I mock a service that returns promise in Angularjs Jasmine unit test?

这就是我模仿它的过程:

    TranslateServiceMock = {
        translate: jasmine.createSpy('translate').and.callFake(function() {
            var deferred = $q.defer();
            deferred.resolve('Remote call result');
            return deferred.promise;
    })};

但是看来这仍然行不通,我猜是因为链接了“完成”和“捕获”方法,

这是我得到的错误:

TypeError: undefined is not a constructor (near '....done();...'

用尽所有可能的原因或解决方法的想法。

1 个答案:

答案 0 :(得分:0)

如评论中所述,完成不是诺言对象的一部分。

我通过对已完成的回调进行存根来完成此工作:

beforeEach(  function () {
    module(myModule.name, function ($provide) {
        // define a .done on the $q Promise
        $provide.decorator('$q', function ($delegate) {
            var Promise = $delegate.when().constructor;
            Promise.prototype.done = angular.noop;
            return $delegate;
        });

        $provide.factory('TranslationService', function ($q) {
            var svc = jasmine.createSpyObj('TranslationService', ['translate']);

            svc.translate.and.returnValue($q.when(''));

            return svc;
        });
    });
});