8

我有一个使用 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>');
               });
           });
       }
);

有谁知道我要去哪里错?任何帮助将非常感激。

4

2 回答 2

0

Angular 不是异步的,我认为两者都不是一个好主意。如果你想找到一个好的模块化方法,好吧,但是在你把它放在你的浏览器上之前使用 RequireJS 优化器来构建所有东西,关于测试,我认为你可以在之前使用 RequireJS 优化器来构建你的模块,它会让你摆脱“即使在测试中的 CommonJS 环境”。

于 2015-01-26T13:37:43.360 回答
0

看起来这将是可变范围的问题,业力对此非常挑剔。我认为你应该全局初始化你的模拟对象,然后将它们设置在 beforeEach 中。

我的测试文件的第一行总是看起来像:

var bodyMock, svcMock, foo, bar

然后在 beforeEach'es 我设置值

编辑:由于 bodyMock 只是一个范围变量,因此在测试实际运行并且浏览器正在寻找对象“bodyMock”时,它找不到任何东西。

于 2016-05-23T16:40:57.370 回答