2014-01-22 78 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

相关问题