angular 中的切换功能如何工作?

how the toggle function work in angular?

我提供这样的服务。

(function(){
  'use strict';
  angular.module('desert').service('desertmanager',desertmanager);

  function desertmanager(){
    this.mode='pie';
    this.setMode=function(val){
      this.mode=val;
    }

    this.getMode=function(){
      return this.mode;
    }

  }
})();

像那样在我的控制器中使用该服务...

(function(){
  'use strict';
  angular.module('app.home').controller('homeCntrl',homeCntrl);
  homeCntrl.$inject=['desertmanager'];

  function homeCntrl(desertmanager){
    //alert(desertmanager.getMode());
    var home=this;
    home.clickbtn=function(){

      home.message='test';
      alert(home.message)
    }

    home.toggle=function(){
      if(desertmanager.getMode()=='pie'){
        desertmanager.setMode('cake')
      }else{
        desertmanager.setMode('yellow')
      }
    }
  }
})();

现在我需要测试我的切换功能。 我喜欢这样,因为 below.But 我收到错误

describe('toggle mode ',function(){
    var modeSpy;
    beforeEach(function(){
      modeSpy=spyOn(desertmanager,'getMode').andReturn('pie');
    })

    it('called',function(){
      controller.toggle();
      expect(modeSpy).toHaveBeenCalledWith('cake');  

    })
  })

我遇到这个错误

TypeError: spyOn(...).andReturn 不是函数

如何测试我的切换功能?如何消除这个错误?

这是我的代码 http://plnkr.co/edit/GAdTPFfl9LGXTczCG1KL?p=preview

第一个错误:您使用的是 Jasmine 2,而 Jasmine 2 中不存在 andReturn()The correct syntaxand.returnValue()

第二个错误:你没有在监视 setMode(),尽管你想检查它是否已被调用。

这是您的 plunkr 的固定版本:http://plnkr.co/edit/JizWQijbH8FkCAI6jzpM?p=preview

describe('toggle mode ',function(){
    beforeEach(function(){
      spyOn(desertmanager,'getMode').and.returnValue('pie');
      spyOn(desertmanager, 'setMode');
    });

    it('called',function(){
      controller.toggle();
      expect(desertmanager.setMode).toHaveBeenCalledWith('cake');  
    });
});