使用jasmine进行单元测试的模拟angularjs服务
我有一个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中定义。
尝试这样的事情
和使用模拟服务的
it('test description', inject(function ($rootScope, $controller){
var scope = $rootScope.$new();
var ctrl = $controller('TodoController', { $scope: scope, getData: mockGetData });
//some test here....
}))
您可以使用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。
我用getDataMock,因为你已经写了,并得到以下错误 - TypeError:无法读取角度模拟isSpecRunning未定义的属性'运行'。js –
我用getDataMock,因为你已经写了,并得到以下错误 - TypeError:无法读取角度mock.js isSpecRunning undefined属性'运行' –
@ r.bhardwaj - 你可以发布你的整个例子在JSFiddle吗? – jelinson
我无法理解,当我们将mockgetdata的名称中的空白数据和函数放在什么都不做时,我会从jasmin调用相同的函数来测试它的功能时会发生什么? –
@ r.bhardwaj,你可以在setData函数中模拟真正的GetData的工作,** data **属性不是必需的,你可以在测试过程中保存一些数据。我已经更新了答案,但我不知道你的服务的逻辑,所以你可以在那里使用任何逻辑。 – IgorCh
得到了一点,但还有一件事要问 - 如果不是创建模拟我得到使用$ injector.get('getData')的'getData'服务,那有什么害处? –