如何在茉莉花中测试被拒绝的Angular(1.6.1)承诺?

时间:2017-01-18 00:01:32

标签: angularjs jasmine promise q

以下是我在角度1.5.x中测试被拒绝的承诺的方法。更新到1.6.1引入了“可能未处理的拒绝”错误。我理解这个错误的目的,但我还没有想出一个简单的方法。 Jasmine(2.5.x)和.throwError()方法似乎导致测试因错误而失败。

describe('TestTarget', () => {
    let $q, $rootScope, TestTarget, SomeModel;

    beforeEach(() => {
        SomeModel = jasmine.createSpyObj('SomeModel', ['get']);

        module('something');
        module($provide => {
            $provide.value('SomeModel', SomeModel);
        });

        inject((_$q_, _$rootScope_, _TestTarget_) => {
            $q = _$q_;
            $rootScope = _$rootScope_;
            TestTarget = _TestTarget_;
        });
    });

    describe('get()', () => {
        it('on error, adds a danger message', () => {
            SomeModel.get.and.returnValue($q.reject());
            // SomeModel.get.and.throwError(); // doesn't work either
            TestTarget.get();
            $rootScope.$digest();
            expect(SomeModel.get).toHaveBeenCalled();
            expect(<< the rejection outcome of TestTarget.get().then() >>);
        });
    });
});

我希望继续在我的模型,服务和控制器中传递被拒绝的承诺。

2 个答案:

答案 0 :(得分:2)

让我们说你的实际代码是这样的:

angular.module('myApp').service('TestTarget', ['SomeModel', function(SomeModel) {
    this.get = function() {
        return SomeModel.get();
    }
}]);

我的假设是你没有.catch块链接到返回的Promise。 在这种情况下,您可以像这样测试它:

it('on error, adds a danger message', () => {
    SomeModel.get.and.returnValue($q.reject('some error'));
    TestTarget.get()
        .then(function() {
            fail('the promise should not have been resolved');
        }).catch(function(err) {
            expect(err).toBe('some error');
        });
    $rootScope.$digest();
    expect(SomeModel.get).toHaveBeenCalled();
});

请注意,我在函数调用中添加了一个catch块。 $rootScope.$digest()确保承诺得到解决,并且所有已锁定的thencatch块都会被调用。

答案 1 :(得分:0)

我有角度1.6.1这个问题。在测试中尝试使用callFake而不是returnValue。

describe('TestTarget', () => {
let $q, $rootScope, TestTarget, SomeModel;

beforeEach(() => {
    SomeModel = jasmine.createSpyObj('SomeModel', ['get']);

    module('something');
    module($provide => {
        $provide.value('SomeModel', SomeModel);
    });

    inject((_$q_, _$rootScope_, _TestTarget_) => {
        $q = _$q_;
        $rootScope = _$rootScope_;
        TestTarget = _TestTarget_;
    });
});

describe('get()', () => {
    it('on error, adds a danger message', () => {
        SomeModel.get.and.callFake(() => $q.reject());
        // SomeModel.get.and.throwError(); // doesn't work either
        TestTarget.get();
        $rootScope.$digest();
        expect(SomeModel.get).toHaveBeenCalled();
        expect(<< the rejection outcome of TestTarget.get().then() >>);
    });
});

});

相关问题