Angular2提供程序自动模拟每个提供程序中的方法

时间:2017-07-20 00:57:47

标签: angular unit-testing

我有一个angular2组件,它依赖于许多提供者。从我到目前为止所读到的为了模拟提供者我有两个选择

  1. 为每个提供商编写模拟服务。
  2. 使用间谍并仅模拟组件调用的方法。
  3. 如果我按下选项1那么我必须编写很多虚拟代码,这是浪费空间。如果我执行选项2,那么我需要对每个提供程序的内容有复杂的了解,然后只编写模拟方法。我想要做的是在所有提供程序中自动模拟所有方法,然后仅在需要时编写间谍(自定义模拟逻辑)。我该怎么做?

    例如,如何自动模拟以下服务

    public class ActualService(){
      public getUsers(){
         //Actual call
      }
    
      public udpateUser(user:User){
         //Actual call to be backend to update the user
      }
    }  
    

    如何使用像Sinon这样的库自动模拟其中的所有内容?或其他什么

1 个答案:

答案 0 :(得分:1)

快捷方式在单元测试中是不可接受的,因为这会导致低质量的测试,在应用时不会失败,并且在失败时难以调试。

最好的方法是创建一个新的存根/模拟对象,它只包含受当前测试影响的方法。当测试代码被更改为引入在测试中未考虑的方法时,这将导致测试失败,并显示明确的错误消息。

尽管描述了缺点,但可以用Sinon做到这一点:

const serviceStub = sinon.createStubInstance(Service);

或者使用Jasmine:

const serviceStub = jasmine.createSpyObj('Service',
  Service.prototype.getOwnPropertyNames
  .filter(prop => typeof Service.prototype[prop] === 'function')
);

...
providers: [{ provide: Service, useValue: serviceStub }]
...
相关问题