我有一个看起来像这样的 ngResourceMockFactory
:
(function() {
'use strict';
angular.module('app')
.factory('NgResourceMock', ngResourceMockFactory)
;
ngResourceMockFactory.$inject = [];
function ngResourceMockFactory() {
function NgResourceMock() {
var context = this;
context.$promise.then = function() {
context.prototype.$promise.then.apply(context, arguments);
};
context.$promise.finally = function() {
context.prototype.$promise.finally.apply(context, arguments);
};
}
NgResourceMock.prototype.$promise = {
then: function(onSuccess, onError) {
this.$promise.onSuccess = onSuccess;
this.$promise.onError = onError;
},
finally: function(onComplete) {
this.$promise.onComplete = onComplete;
}
};
return NgResourceMock;
}
})();
我在 beforeEach
中将其注入(inject)到我的测试中,如下所示:
beforeEach(inject(function(NgResourceMock) {
ngResourceMock = new NgResourceMock();
}));
然后我这样使用它:
describe('initiateWorkflow function', function() {
beforeEach(function() {
vm.player = {id: 123};
spyOn(dataService, 'initiateWorkflow').and.returnValue(ngResourceMock);
vm.initiateWorkflow();
});
it('should call dataService.initiateWorkflow', function() {
expect(dataService.initiateWorkflow).toHaveBeenCalledWith({playerId: vm.player.id}, {});
});
});
但我一直看到以下错误:
TypeError: 'undefined' is not an object (evaluating 'context.prototype.$promise')
这让我相信我的 ngResourceMockFactory
有问题,但我不确定是什么。
最佳答案
不知道这是否有任何帮助,但如果您尝试评估测试中的异步操作,您可能需要使用 Jasmine 中的 done()
方法。
根据他们的文档:
beforeEach(function(done) {
setTimeout(function() {
value = 0;
done();
}, 1);
});
通过将 done
作为 beforeEach
回调的参数传递,在 before each 之后运行的任何测试都将等到 done()
函数已被调用。
来源:Jasmine (异步支持部分)。
希望这对您有所帮助。
关于javascript - 在 Angular 单元测试中模拟 ngResource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39877212/