我是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 ...."那么它会因超时而出错。
谢谢
答案 0 :(得分:3)
Angular承诺在下一个摘要周期之前不会得到解决。
请参阅http://brianmcd.com/2014/03/27/a-tip-for-angular-unit-tests-with-promises.html:
在单元测试Angular时,您会很快遇到一件事 应用程序是需要在某些情况下手动消化循环 情境(通过范围。$ apply()或范围。$ digest())。不幸的是,一个 这些情况是承诺解决,这不是很明显 开始Angular开发人员。
我相信添加$rootScope.$apply()
可以解决您的问题并强制解析承诺,而无需进行异步测试。