使用mocha返回promise的测试方法调用

时间:2014-11-05 18:55:25

标签: javascript angularjs mocha sinon

我是Mocha的新手,但我现在读到他们支持承诺,但我似乎无法找到解决我问题的任何文档。我有一个返回promise的authenticate方法。在我的测试中,我需要等到完成后才能通过/失败。

这是我的Authenticate工厂:

(function() {
'use strict';

angular.module('app.authentication').factory('authentication', authentication);

/* @ngInject */
function authentication($window, $q, $location, authenticationData, Session) {
    var authService = {
        authenticate: authenticate
    };

    return authService;

    function authenticate() {
        var token = authenticationData.getToken();
        var deferral = $q.defer();
        if (!Session.userId && token) {
            authenticationData.getUser(token).then(function(results) {
                Session.create(results.id, results.userName, results.role);
                deferral.resolve();
            });
        }
        else{
            deferral.resolve();
        }

        return deferral.promise;
    }.........

这是我的测试:

describe('authentication', function() {

    beforeEach(function() {
        module('app', specHelper.fakeLogger);
        specHelper.injector(function($q, authentication, authenticationData, Session) {});
    });

    beforeEach(function() {
        sinon.stub(authenticationData, 'getUser', function(token) {
            var deferred = $q.defer();
            deferred.resolve(mockData.getMockUser());
            return deferred.promise;
        });
    });

    describe('authenticate', function() {
        it('should create Session with userName of TestBob', function() {
            authentication.authenticate().then(function(){
                console.log('is this right?');
                expect(Session.userName).to.equal('TesaatBob');
            }, function(){console.log('asdfasdf');});
        });
    });
});

当我运行它时,测试通过,因为它永远不会在承诺范围内,并且永远不会达到预期。如果我把"返回authenication.authenticate ...."那么它会因超时而出错。

谢谢

1 个答案:

答案 0 :(得分:3)

Angular承诺在下一个摘要周期之前不会得到解决。

请参阅http://brianmcd.com/2014/03/27/a-tip-for-angular-unit-tests-with-promises.html

  

在单元测试Angular时,您会很快遇到一件事   应用程序是需要在某些情况下手动消化循环   情境(通过范围。$ apply()或范围。$ digest())。不幸的是,一个   这些情况是承诺解决,这不是很明显   开始Angular开发人员。

我相信添加$rootScope.$apply()可以解决您的问题并强制解析承诺,而无需进行异步测试。