2014-10-17 87 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'時,它找不到任何東西。