有两种方法(或肯定有更多方法)。
想象一下这种服务(无论它是工厂都没关系):
app.service('foo', function() { this.fn = function() { return "Foo"; };});
使用此控制器:
app.controller('MainCtrl', function($scope, foo) { $scope.bar = foo.fn();});
一种方法是使用要使用的方法创建对象并对其进行监视:
foo = { fn: function() {}};spyOn(foo, 'fn').andReturn("Foo");
然后,将其
foo作为dep传递给控制器。无需注入服务。那可行。
另一种方法是模拟服务并注入模拟的服务:
beforeEach(module('app', function($provide) { var foo = { fn: function() {} }; spyOn(foo, 'fn').andReturn('Foo'); $provide.value('foo', foo);}));
当您注入时
foo,它将注入这一点。
在此处查看:http :
//plnkr.co/edit/WvUIrtqMDvy1nMtCYAfo?p=preview
对于那些努力使答案起作用的人,
从Jasmine 2.0
andReturn()开始
and.returnValue()
因此,例如,在上面的unk客的第一次测试中:
describe('controller: MainCtrl', function() { var ctrl, foo, $scope; beforeEach(module('app')); beforeEach(inject(function($rootScope, $controller) { foo = { fn: function() {} }; spyOn(foo, 'fn').and.returnValue("Foo"); // <----------- HERE $scope = $rootScope.$new(); ctrl = $controller('MainCtrl', {$scope: $scope , foo: foo }); })); it('Should call foo fn', function() { expect($scope.bar).toBe('Foo'); });});
(来源:Rvandersteen)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)