在工厂中测试功能

Testing a function in factory

.factory('Tag', function($window) {

  var Context = {};

  function reset() {
    return Context !== {} ? Context : {};
  }

  return{
    reset:reset
  };
})

我做过这样的测试

describe('method: reset()', function(){
  it('should reset the Context variable', function(){
    spyOn(Tag, 'reset').andCallFake(function(){
      return Context;
    });

    expect(Context).toEqual({});
  });

  afterEach(function(){
    if(Context!== {}){
      Context = {};
    }
  })
});

是,这个测试是准确的,如果是,那为什么我的测试覆盖率没有增加..

您正在调用一个假函数,而不是真正的函数,因此您实际函数中的代码永远不会执行。

您的代码覆盖工具仅标记实际命中的代码。

andCallFake 用于模拟您对测试不感兴趣的外部函数,您只需要在实际测试的代码调用它时得到一些模拟响应。

您的代码应该真正调用...

Tag.reset()

现在,如果 Tag.reset() 调用另一个您不想测试的服务中的代码,那么您可以在该调用上使用 callFake。 请记住这是 "unit" 测试。您要测试的 "unit" 代码是服务内部的代码,而不是服务外部的代码。