首页 > 解决方案 > 如何使用 done() 和 catch() 回调模拟在 angularjs 中返回承诺的服务

问题描述

我想在 angularjs 中模拟一个用于单元测试的服务,它看起来像这样:

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

按照这个答案: 如何模拟在 Angularjs Jasmine 单元测试中返回承诺的服务?

这就是我模拟它的方法:

    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();...'

没有想法为什么会发生这种情况或如何解决这个问题..

标签: angularjsunit-testingjasmine

解决方案


正如评论中提到的, done 不是 promise 对象的一部分。

我通过存根完成的回调来完成这项工作:

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;
        });
    });
});

推荐阅读