在我的 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
and spyOnProperty
?
我还想知道属性数组的用法是什么createSpyObj
定义。到目前为止,我还没有在网上看到任何解释它的例子。