我有一个使用AngularAMD / RequireJS / Karma / Jasmine的项目,我的基本配置全部正常工作,大多数单元测试运行并成功通过。
我无法使用angular.mock.module或angularAMD.value()正确注入模拟服务。
我有:
// service definition in services/MyService.js
define(['app'],
function(app) {
app.factory('myService', [ '$document', function($document) {
function add(html) {
$document.find('body').append(html);
}
return { add: add };
}]);
}
);
// test
define(['angularAMD', 'angular-mocks', 'app', 'services/MyService'],
function(aamd, mocks, app) {
describe('MyService', function() {
var myBodyMock = {
append: function() {}
};
var myDocumentMock = {
find: function(sel) {
// this never gets called
console.log('selector: ' + sel);
return myBodyMock;
}
};
var svc;
beforeEach(function() {
// try standard way to mock a service through ng-mock
mocks.module(function($provide) {
$provide.value('$document', myDocumentMock);
});
// hedge my bets - try overriding in aamd as well as ng-mock
aamd.value('$document', myDocumentMock);
});
beforeEach(function() {
aamd.inject(['myService',
function(myService) {
svc = myService;
}]);
});
it('should work', function() {
// use svc expecting it to have injected mock of $document.
spyOn(myDocumentMock, 'find').andCallThrough();
spyOn(myBodyMock, 'append');
svc.add('<p></p>');
expect(myDocumentMock.find).toHaveBeenCalledWith('body');
expect(myBockMock.append).toHaveBeenCalledWith('<p></p>');
});
});
}
);
有谁知道我哪里出错了?任何帮助将不胜感激。
答案 0 :(得分:0)
Angular不是异步的,我认为不是一个好的意识形态同时使用。如果你正试图达到一个好的模块化方法,好吧,但是在你把它放到浏览器之前使用RequireJS优化器来构建所有内容,关于测试,我认为你可以使用RequireJS优化器来构建你的模块,即使在测试中,它也会让你摆脱“CommonJS环境”。
答案 1 :(得分:0)
看起来这是一个变量范围的问题,因果报应非常挑剔。我认为你应该全局初始化你的模拟对象,然后在beforeEach中设置它们。
我的测试文件的顶行看起来像是:
var bodyMock,svcMock,foo,bar
然后在beforeEach'es中我设置值
编辑:由于bodyMock只是一个范围变量,在测试实际运行的时候,浏览器正在寻找一个对象'bodyMock',它找不到任何东西。