在我的 Angular 测试中模拟依赖项时,我通常使用 jasmine.createSpyObj
创建一个间谍对象:
const serviceSpy= jasmine.createSpyObj('MyService', ['method']);
然后将其提供给 TestBed:
providers: [
{provide: MyService, useValue: serviceSpy}
]
当我在测试中使用它时,我可以指定所需的返回值:
serviceSpy.method.and.returnValue(of([...]));
现在我还需要模拟属性,但我不知道应该如何完成。 createSpyObj
允许定义属性名称:
const serviceSpy= jasmine.createSpyObj('MyService', ['method'], ['property']);
但我已经根据大量文章和答案尝试了多种解决方案,但均未成功,例如:
// Cannot read property 'and' of undefined
serviceSpy.property.and.returnValue(true);
// not declared configurable
spyOnProperty(serviceSpy, 'property').and.returnValue(true);
// no build errors, but value stays 'undefined'
serviceSpy.property = true;
我可以让它“一半”工作的唯一方法是:
let fakeValue = true;
const serviceSpy= jasmine.createSpyObj('MyService', ['method'], {'property': fakeValue});
这里的问题是它在创建时是一次性的。如果我想改变测试中的期望值,它是行不通的。
fakeValue = false;
serviceSpy.property ==> stays to the initial value 'true';
是否存在通过创建间谍对象来解决模拟方法和属性的解决方案,或者我是否应该创建自己的假类,然后我可以在其上使用 spyOn
和 spyOnProperty
?
我还想知道 createSpyObj
定义中属性数组的用法。到目前为止,我还没有在网上看到任何解释它的例子。
原文由 Ronald 发布,翻译遵循 CC BY-SA 4.0 许可协议
根据 文档(强调我的):
(Object.getOwnPropertyDescriptor(obj, “x”)?.get as Spy<() => number>).and.returnValue(7);
”`
操场