【问题标题】:Testing Private Properties on a Class Instance [TypeScript]在类实例上测试私有属性 [TypeScript]
【发布时间】:2020-09-29 16:54:10
【问题描述】:

我有一个带有构造函数的类。

export default class S3Client {
  private readonly s3: S3;
  private readonly bucketName: string;
  private readonly useS3Data: boolean;

  constructor(configuration: IConfig = config, region: string = 'eu-west-1') {
    this.bucketName = configuration.bucketName;
    this.s3 = new S3({ region });
    this.useS3Data = [ 'int', 'test', 'live' ].includes(configuration.env);
  }
...
}

这是手动编写的,不是由 IDE 编写的,因此需要测试(除了代码覆盖率检查器在没有这些测试时会不高兴)。

是的,它们是通过对此类的测试方法进行间接测试的,但是如何直接测试属性是否符合预期?

describe('constructor', () => {
  // mock setup stuff here
  test('as expected', () => {
    const clientUnderTest = new S3Client(mockEnvValueObjPassedIn);
    expect(clientUnderTest.bucketName).toEqual('test-bucket-name');
  });
});

`` 这显然不起作用,因为bucketName 是私有的。 我曾尝试使用Object.getPrototypeOf(clientUnderTest); 使用clientUnderTest 的另一个原型,但由于原型的工作方式复杂,它只会产生一个空对象,但似乎确实知道Object.getOwnPropertyNames(clientUnderTest) 的属性。 我尝试复制该对象,因为我可以使用Object.assign({}, underTest); 控制台记录我的clientUnderTest 的字符串化版本,但在属性隐私方面我得到完全相同的错误。请问我该如何解决?

我不感兴趣

  • 制作吸气剂
  • 公开这些价值观
  • 使它们受到保护,然后创建一个可访问的子类
  • 为了满足测试而必须破坏我的代码的任何其他 hack。

【问题讨论】:

标签: typescript jestjs


【解决方案1】:

对于const a = new S3Clienta['bucketName'] 有效,这就是我最终采用的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多