2013-03-31 66 views
1

我有一個Angular JS應用程序,其中包含一個模塊和一些服務。我的控制器使用這些服務。在Jasmine測試用例中,我使用Jasmine的createSpy創建了一個服務模擬。以下是模擬服務:茉莉花的間諜投擲不是功能錯誤

beforeEach(module(function ($provide) { 
    shoppingData = function() { 
     getAllItems: jasmine.createSpy('getAllItems'); 
     addAnItem: jasmine.createSpy('addAnItem'); 
     removeItem: jasmine.createSpy('removeItem'); 
    }; 
    $provide.value('shoppingData', shoppingData); 
})); 

控制器在創建對象後立即調用getAllItems函數。我創建了另一個創建控制器對象的beforeEach塊。以下是試塊,以檢查是否getAllItems被稱爲:

it("Should call getAllItems function on creation of controller", function() { 
    expect(shoppingData.getAllItems).toHaveBeenCalled(); 
}); 

當我運行在瀏覽器中亞軍規範網頁,測試失敗,以下錯誤:類型錯誤:「shoppingData.getAllItems」是不是一個函數

我看到了幾個類似的例子,這種測試沒有任何問題。任何人都可以指出什麼是缺失或什麼是錯誤的?

更新:我創建了一個plunker with the part that fails

回答

2

似乎是一個錯字,如果這是真正的代碼。在撥付部分更改爲:

shoppingData = { 
    getAllItems: jasmine.createSpy('getAllItems'), 
    addAnItem: jasmine.createSpy('addAnItem'), 
    removeItem: jasmine.createSpy('removeItem') 
}; 

只是改變了功能,對象,改變了;,

更新1:

只考慮在從事間諜活動的現有對象:

var deferred, _shoppingData; 

beforeEach(module('shopping')); 

beforeEach(inject(function(shoppingData, $q) { 
    _shoppingData = shoppingData; 
    deferred = $q.defer(); 
    spyOn(shoppingData, 'getAllItems').andReturn(deferred.promise); 
})); 

it('should have called shoppingData.getAllItems', function() { 
    expect(_shoppingData.getAllItems).toHaveBeenCalled(); 
}); 
+0

我試過這個方法了。但它會拋出一個錯誤:'無法將shoppingData.getAllItems'轉換爲對象 –

+0

也許您正在做其他事情。我做了一個[在這裏工作的Plnker](http://plnkr.co/edit/Fj66l17cVtMe3XoxK8CS?p=preview)。看它。如果你什麼都不懂,請告訴我,我會盡力解釋。也許你忘了創建控制器,或者注入一些東西。只有當你第一次注入東西的時候,模塊纔會被創建,並且shoppingData可以被使用。 –

+0

感謝您的努力。調整好你的plunker並分析我的代碼後,我知道它失敗了,因爲我調用getAllItems的函數使用返回的對象來調用then()函數。我分叉你的plnk並創建了一個演示。你可以從這裏訪問它:http://plnkr.co/edit/BenU8lJtICS2uNyrtjns?p=preview –

0

你爲什麼不嘗試:

var scope, myController; 

beforeEach(inject(function($rootScope, $controller) { 
    scope = $rootScope.$new(); 
    myController = $controller.('controllerName', { 
    $scope: scope, 
    shoppingData: jasmine.createSpyObj('shoppingData', ['getAllItems', 'addAnItem', 'removeItem']) 
    }); 
}));