1

在升级到 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.definePropertyas configurable: true,因为当我通过 Jasmine 时,我看到它失败了:

if (!descriptor.configurable) {
  throw new Error(
    getErrorMsg(propertyName + ' is not declared configurable')
  );
}

并且descriptordescriptor = 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. 所以我不确定究竟是什么导致了测试中的原始错误。

4

1 回答 1

0

我错过了一些有关创建测试的附加信息。要创建我正在使用的注入服务的实例,使用ts-mockito创建instance()每个类。

我认为正是这个调用instance()创建了不可配置的属性。

有效:

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

变成:

service = new Service(new Backend);

解决问题

于 2020-02-18T14:49:00.250 回答