在升级到 Angular 9(从 8.1)和 Typescript 3.7(从 <3.6)时,我遇到了一个问题spyOnProperty
我的服务看起来像:
class Backend {
public get baseURL(): string {
return 'http://baseurl.com/';
}
}
我在升级之前的测试将spyOnProperty
spyOnProperty(backend, 'baseURL', 'get').and.returnValue('http://new');
但是,我现在收到此错误:
Error: <spyOnProperty> : baseURL is not declared configurable
Usage: spyOnProperty(<object>, <propName>, [accessType])
我知道我需要Object.defineProperty
as configurable: true
,因为当我通过 Jasmine 时,我看到它失败了:
if (!descriptor.configurable) {
throw new Error(
getErrorMsg(propertyName + ' is not declared configurable')
);
}
并且descriptor
由descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
所以在Javascript中我想:
Object.defineProperty(backend.prototpye, 'baseURL', {value: 'http://new', configurable: true});
以确保可以监视此属性。
但是,我的问题是如何使用 Typescript 应用相同的可配置项。我试图Object.defineProperty
再次运行,但我得到一个错误defineproperty Cannot redefine property
,这对于为什么首先存在检查是有道理的。
我尝试使用这里configurable
定义的建议装饰器:
function configurable(value: boolean) {
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
descriptor.configurable = value;
};
}
但这不起作用,还要注意,当我在上述方法中放置断点时,descriptor.configurable
实际上true
在分配value
. 所以我不确定究竟是什么导致了测试中的原始错误。