2014-10-17 42 views
8

我有一个项目使用AngularAMD/RequireJS/Karma/Jasmine,我有基本的配置所有工作,大多数单元测试运行并成功通过。如何用角色/茉莉花来模拟angularAMD中的服务?

我无法使用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

看看angularamd的git,有一些很好的测试例子。 – 2015-01-08 09:37:14

回答

0

角度不是异步的,我认为这不是一个好的理想使用。如果你想要达到一个好的模块化方法,那么可以,但是在你把它放到浏览器之前,使用RequireJS优化器来构建所有东西,关于测试,我认为你可以在使用RequireJS优化器来构建你的模块之前,它会让你摆脱“CommonJS环境即使在测试中”。

0

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

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

VAR bodyMock,svcMock,富,酒吧在beforeEach'es

然后,我设置的值

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