2013-07-09 222 views
69

我試圖單元測試控制器代碼,需要其他模塊依賴一個模塊內,但一直沒能弄清楚如何正確地嘲笑他們。嘲諷角模塊依賴測試

我使用的茉莉花框架,並與噶(Testacular)上運行我的測試。

模塊代碼

var app = angular.module('events', ['af.widgets', 'angular-table']); 

app.controller('eventsCtrl', function([dependencies]){ 
    $scope.events = []; 
    ... 
}); 

規格代碼

describe('events module', function(){ 
    var $scope, 
     ctrl; 

    beforeEach(function(){ 
     angular.mock.module('af.widgets', []); 
     angular.mock.module('angular-table', []); 
     module('events', ['af.widgets', 'angular-table']); 
    }); 

    beforeEach(inject(function($rootScope, $controller){ 
     $scope = $rootScope.new(); 
     ctrl = $controller('NameCtrl', { 
      $scope: $scope, 
     }); 
    })); 

    it('should have an empty events array', function(){ 
     expect($scope.events).toBe([]); 
    }) 
}); 

我得到的錯誤是噶是 「沒有模塊af.widgets」,所以很明顯,我不是嘲笑模塊依賴關係。任何提示?

+1

$範圍= $ rootScope.new();應該是$ scope = $ rootScope。$ new();(可能是我們的版本) –

回答

60

結構,這樣我的文件已經使用此代碼:

beforeEach(function(){ 
    module('moduleToMock'); 
    module(function ($provide) { 
     $provide.value('yourService', serviceMock); 
    }); 
}); 

這是有用的,如果你想嘲笑服務也想要單元測試服務(在另一個茉莉形容)。 通過fscof提出的解決方案是好的,但你不能創建爲angular-table模塊單元測試。

+4

這是對的。因爲你經常不想爲所有測試使用一個模擬。也在這裏:http://stackoverflow.com/a/18756347/1105860 –

+0

借調。這是更正確的。 – dgtc

+0

如果我想將'serviceMock'放到另一個文件中而不聲明全局變量呢? –

44

這是我想通了:

我沒有加載任何「角表」模塊,我karma.conf.js文件,因此錯誤。起初,這是有意的,因爲我想測試沒有實際表模塊的'events'模塊。

我能夠很容易地在我所謂的「嘲笑/角table.js」測試文件夾中創建一個新文件嘲笑「角表」模塊,並添加以下代碼:

/嘲笑/角table.js

'use-strict'; 
angular.module('angular-table', []); 

我添加文件到我的karma.conf.js文件,與真正的「事件」模塊一起,我想測試:

karma.conf.js

... 
files = [ 
    JASMINE, 
    JASMINE_ADAPTER, 
    'scripts/libs/angular.js', 
    'scripts/libs/angular-mocks.js', 
    'scripts/events.js', // this is the real module. 
    'scripts/mocks/*.js', //loads all custom mocks. 
    'scripts/specs/*.spec.js' // loads my spec file. 
] 
... 

最後,在我的spec文件,我可以通過在beforeEach塊分別打電話給他們兩個模塊添加:

規格/ events.spec.js

beforeEach(function(){ 
    module('angular-table'); 
    module('events'); 
}); 

我計上心來。如果你想嘲笑那些聲明一個或多個服務我公頃模塊從this post

+2

難道你沒有通過調用angular.module來模擬'angular-table'模塊嗎?我想你想調用模塊,因爲angular-mocks將它附加到全局範圍?無論如何,謝謝你,因爲這幫助我獲得了我的規格和運行。 – phillyslick

+0

「我可以通過在我的測試文件夾中創建一個名爲'mocks/angular-table.js'的新文件來輕鬆模擬'angular-table'模塊,並添加了以下代碼: /mocks/angular-table.js 「 –

+0

@fscof鏈接給404. – Lucio