При обновлении до Angular 9 (с 8.1) и Typescript 3.7 (с <3.6) я столкнулся с проблемой с <code>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
как configurable: true
, как при переходе через Жасмин, я вижу, что он выходит из строя при:
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
. Поэтому я не уверен, что на самом деле является причиной первоначальной ошибки в тестах.