我做了一个工厂的简单演示,我正在尝试使用 jasmine 进行测试。我可以运行测试,但我使用 spyOn 方法。我宁愿使用 jasmine.createSpy 或 jasmine.createSpyObj 进行相同的测试。有人可以帮我重构我的代码,以便在我的例子中使用这些方法吗?
http://plnkr.co/edit/zdfYdtWbnQz22nEbl6V8?p=preview
describe('value check',function(){
var $scope,
ctrl,
fac;
beforeEach(function(){
module('app');
});
beforeEach(inject(function($rootScope,$controller,appfactory) {
$scope = $rootScope.$new();
ctrl = $controller('cntrl', {$scope: $scope});
fac=appfactory;
spyOn(fac, 'setValue');
fac.setValue('test abc');
}));
it('test true value',function(){
expect(true).toBeTruthy()
})
it('check message value',function(){
expect($scope.message).toEqual(fac.getValue())
})
it("tracks that the spy was called", function() {
expect(fac.setValue).toHaveBeenCalled();
});
it("tracks all the arguments of its calls", function() {
expect(fac.setValue).toHaveBeenCalledWith('test abc');
});
})
更新
angular.module('app',[]).factory('appfactory',function(){
var data;
var obj={};
obj.getValue=getValue;
obj.setValue=setValue;
return obj;
function getValue(){
return data;
}
function setValue(datavalue){
data=datavalue;
}
}).controller('cntrl',function($scope,appfactory){
appfactory.setValue('test abc');
$scope.message=appfactory.getValue()
})
答案 0 :(得分:2)
我已更改了您的plunkr:
spy = jasmine.createSpy('spy');
fac.setValue = spy;
修改强>
在茉莉花中,嘲笑被称为间谍。有两种方法可以 在Jasmine中创建一个间谍:spyOn()只能在方法时使用 已存在于对象上,而jasmine.createSpy()将返回 一个全新的功能。
找到信息here。该链接提供了有关创建间谍的更多信息。
答案 1 :(得分:0)
正如评论中所说,你绝对不需要间谍来测试这样的服务。如果您必须为您的服务编写文档:您会说:
setValue()
允许存储值。然后可以通过调用getValue()
来检索此值。
这就是你应该测试的:
describe('appfactory service',function(){
var appfactory;
beforeEach(module('app'));
beforeEach(inject(function(_appfactory_) {
appfactory = _appfactory_;
}));
it('should store a value and give it back',function() {
var value = 'foo';
appfactory.setValue(value);
expect(appfactory.getValue()).toBe(value);
});
});
此外,您的服务不是工厂。工厂是用于创建事物的对象。您的服务不会创建任何内容。它使用工厂功能在角度模块中注册。但服务本身不是工厂。