Убедитесь, что spyOnProperty создает настраиваемые свойства с Object.defineProperty - PullRequest
1 голос
/ 18 февраля 2020

При обновлении до 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. Поэтому я не уверен, что на самом деле является причиной первоначальной ошибки в тестах.

1 Ответ

0 голосов
/ 18 февраля 2020

Я пропустил некоторую дополнительную информацию о создании моих тестов. Чтобы создать экземпляр внедренного сервиса, который я использую, ts-mockito для создания instance() каждого класса.

Я думаю, что это был вызов instance(), который создавал свойства как не настраиваемые.

Эффективно:

service = new Service(instance(new Backend));

Изменено на:

service = new Service(new Backend);

Решает проблему

...