2014-01-22 208 views
6

我有一個Angular App,我想用它創建單元測試用例jasmine
在我AngularJS的應用程序,我有一個服務:
使用jasmine進行單元測試的模擬angularjs服務

var canceler; 
var myServices = angular.module('myServices', ['ngResource']) 

myServices.factory('getData', ['$http', '$q', function($http, $q){ 
    var canceler; 
    return { 
     setData: function(url, callback, error) { 
        canceler = $q.defer(); 
        $http.post(url, {}, {timeout:canceler.promise}).success(callback).error(error); 
     }, 
     abort: function(){ canceler.resolve();} 
    } 
}]); 

這個服務正在使用的控制器。

現在我怎麼能提供這個「getData」服務到我在controllerSpecs.js中使用的注入器(用於使用茉莉花的單元測試)的模擬。

作爲參考,controllerSpecs.js的代碼在Getting error while using Jasmine with AngularJS中定義。

回答

2

嘗試這樣的事情

和使用模擬服務的

it('test description', inject(function ($rootScope, $controller){ 
    var scope = $rootScope.$new(); 
    var ctrl = $controller('TodoController', { $scope: scope, getData: mockGetData }); 
    //some test here.... 
})) 
+0

我無法理解,當我們將mockgetdata的名稱中的空白數據和函數放在什麼都不做時,我會從jasmin調用相同的函數來測試它的功能時會發生什麼? –

+0

@ r.bhardwaj,你可以在setData函數中模擬真正的GetData的工作,** data **屬性不是必需的,你可以在測試過程中保存一些數據。我已經更新了答案,但我不知道你的服務的邏輯,所以你可以在那裏使用任何邏輯。 – IgorCh

+0

得到了一點,但還有一件事要問 - 如果不是創建模擬我得到使用$ injector.get('getData')的'getData'服務,那有什麼害處? –

11

您可以使用AngularJS的$provide服務。 This page演示如何使用Jasmine's spies來模擬服務的功能。基本上,在你的茉莉花測試,你可以包括:

var getDataMock; 

beforeEach(function() { 
    getDataMock = { 
    setData: jasmine.createSpy(), 
    abort: jasmine.createSpy() 
    }; 

    module(function($provide) { 
    $provide.value('getData', getDataMock); 
    }); 
}); 

這告訴而是採用了真正的getData服務,模擬將在其位置使用AngularJS。在這個例子中,使用Jasmine spy進行模擬可以讓您輕鬆創建對控制器調用getData服務的方式和時間的期望。您也可以將getDataMock設置爲任何其他對象,但支持與真實getData服務相同的API是有意義的。

對於獎勵積分,您可以在單獨的文件中指定getDataMock對象,以便模擬可以很容易地用於任何數量的單元測試,其中測試的東西使用getData。然而,這需要使用您正在使用的任何Jasmine亞軍的一些配置。

這是假設你想單元測試控制器。如果你想單元測試getData服務本身,AngularJS專門爲http請求提供了一個很好的mocking utility

+0

我用getDataMock,因爲你已經寫了,並得到以下錯誤 - TypeError:無法讀取角度模擬isSpecRunning未定義的屬性'運行'。js –

+0

我用getDataMock,因爲你已經寫了,並得到以下錯誤 - TypeError:無法讀取角度mock.js isSpecRunning undefined屬性'運行' –

+0

@ r.bhardwaj - 你可以發佈你的整個例子在JSFiddle嗎? – jelinson

相關問題