【问题标题】:How to I mock a service returning a promise in angularjs with done() and catch() callbacks如何使用 done() 和 catch() 回调模拟在 angularjs 中返回承诺的服务
【发布时间】:2019-09-20 03:00:42
【问题描述】:

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

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

【问题讨论】:

标签: angularjs unit-testing jasmine


【解决方案1】:

如 cmets 中所述,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;
        });
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 2014-07-05
    • 2015-05-29
    • 2013-07-22
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多