在测试角度分量时模拟依赖关系。 ComponentA注入ServiceA,我想在测试中模拟serviceA
class ServiceA {
private _prop = 1;
get prop (): number {
return this._prop;
}
set prop(p: number) {
this._prop;
}
}
class ComponentA {
private injectedService: ServiceA;
constructor(private injectedService: ServiceA) {
this.injectedService = injectedService;
}
method () {
this.injectedService.prop = this.injectedService.prop + 1;
if (this.injectedService.prop === 5) {
this.injectedService.prop = 1;
}
}
}
使用上述程序结构,重要的是要有一个具有accessor(injectedService.prop的getter和setter)实现的serviceA模拟程序,因为程序的一部分取决于先前设置的injectedService.prop的值。
我尝试过的选项:
ts-mockito: ts-mockito模拟没有设置访问类型。由于这个限制,ts setter将不会被识别。一种解决方法是定义实际方法以“设置”和“获取”并调用这些方法。设置者仍将需要以下解决方法:
// default get stub
when(mock.getProp()).thenReturn();
// setter redefines get stub
when(mock.setProp(anything())).thenCall((p) => {
when(mock.getProp()).thenReturn(a);
});
static mock调用构造函数,将目标模拟类作为其他依赖项注入时存在很大缺陷
dynamic mock这样的条件(this.injectedService.prop === 5)永远不会是真实的,因为this.injectedService.prop(即mock.object.prop)指向一个函数。关于这一点,我觉得可能还有一种方法尚待解决,我将不胜感激
我不想做的事
除了添加标准打字稿访问器之外,我不想修改要模拟的类
我不想仅出于创建用于测试的模拟的目的而创建要模拟的类的接口/类
尽管我愿意在有充分的理由或标准的情况下对此做出妥协
如果有人能引导我进入经过适当测试并且遵循标准(如果有)的代码库,我也将不胜感激。
注意:我正在使用karma +茉莉花来测试一个有角度的应用程序...但是所有这些都不算什么,因为我只是从构造函数创建类,没有Testbed只是简单的打字稿类单元测试。