【发布时间】: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