我有一个angular2组件,它依赖于许多提供者。从我到目前为止所读到的为了模拟提供者我有两个选择
如果我按下选项1那么我必须编写很多虚拟代码,这是浪费空间。如果我执行选项2,那么我需要对每个提供程序的内容有复杂的了解,然后只编写模拟方法。我想要做的是在所有提供程序中自动模拟所有方法,然后仅在需要时编写间谍(自定义模拟逻辑)。我该怎么做?
例如,如何自动模拟以下服务
public class ActualService(){
public getUsers(){
//Actual call
}
public udpateUser(user:User){
//Actual call to be backend to update the user
}
}
如何使用像Sinon这样的库自动模拟其中的所有内容?或其他什么
答案 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 }]
...