Angularjs createSpy如何在Angular+;茉莉花?

Angularjs createSpy如何在Angular+;茉莉花?,angularjs,angularjs-directive,angularjs-scope,jasmine,karma-runner,Angularjs,Angularjs Directive,Angularjs Scope,Jasmine,Karma Runner,我制作了一个简单的工厂演示,我正试图用茉莉花来测试它。我可以运行测试,但我使用的是spyOn方法。我宁愿使用jasmine.createSpy或jasmine.createSpyObj来做同样的测试。有人能帮我重构代码,以便在我的示例中使用这些方法吗 更新 angular.module('app',[]).factory('appfactory',function(){ var data; var obj={}; obj.getValue=getValue; obj.setVa

我制作了一个简单的工厂演示,我正试图用茉莉花来测试它。我可以运行测试,但我使用的是spyOn方法。我宁愿使用jasmine.createSpyjasmine.createSpyObj来做同样的测试。有人能帮我重构代码,以便在我的示例中使用这些方法吗

更新

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()
})
我已更改了您的:

编辑

在《茉莉花》中,模仿者被称为间谍。有两种方法可以 在Jasmine中创建间谍:spyOn()只能在 对象上已存在,而jasmine.createSpy()将返回 一个全新的功能


找到了信息。该链接提供了有关创建间谍的更多信息。

如评论中所述,间谍绝对不需要测试此类服务。如果您必须为您的服务编写文档:您会说:

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);
  });
});

此外,您的服务不是工厂。工厂是用来创造事物的对象。你的服务没有创造任何东西。它使用工厂函数注册在角度模块中。但是服务本身并不是一个工厂。

你想实现什么?除了第二个
it()
,所有其他的都不会测试你的任何代码:它们只是测试Jasmine是否按照文档所述工作。我正在尝试测试我的工厂。。!!我想使用spyon和jasmine.createSpyi测试我的工厂如果目标是测试服务,您不需要创建任何控制器。注入服务,调用其方法,并检查它们是否执行了它们应该执行的操作。你不需要任何间谍,除非你正在测试的服务依赖于你想要模拟/间谍的其他服务application@JBNizet请建议解决方案你做了什么…你能解释更多吗我只是用:jasmine.createSpy创建了一个间谍。并将函数“setValue”替换为此间谍。我不是100%肯定,但我相信Jasmine在使用“spyOn”方法时也会做类似的事情。
 spy = jasmine.createSpy('spy');

 fac.setValue = spy;
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);
  });
});