代码之家  ›  专栏  ›  技术社区  ›  user944513

createSpy如何在Angular+Jasmine中工作?

  •  5
  • user944513  · 技术社区  · 9 年前

    我做了一个工厂的简单演示,我正在尝试使用 茉莉花 。我可以运行测试,但我正在使用 监视 方法我宁愿用 茉莉花.创建副本 茉莉花.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()
    })
    
    2 回复  |  直到 9 年前
        1
  •  2
  •   Daan van Hulst    9 年前

    我已经改变了你的 plunkr :

     spy = jasmine.createSpy('spy');
    
     fac.setValue = spy;
    

    编辑

    在《茉莉花》中,嘲笑被称为间谍。有两种方法 在Jasmine中创建间谍:spyOn()只能在方法 对象上已经存在,而jasmine。createSpy()将返回 全新的功能。

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

        2
  •  0
  •   JB Nizet    9 年前

    正如评论中所说,你完全没有必要让间谍测试这种服务。如果您必须为您的服务编写文档:您会说:

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

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