我正在使用NestJS(使用TypeScript)制作一个API,它使用JestJS作为默认测试框架。我正在为服务类编写测试,并且试图访问其私有函数(由TypeScript强制执行),但是出于明显的原因,我不能这样做。
其他语言(例如Java)的传统解决方案是将函数更改为 package 或 internal 范围,但这在TypeScript中不存在。 / p>
我如何才能出于测试目的访问这些功能,但仍要强制执行私有访问(作为良好做法)?
答案 0 :(得分:4)
作为准则,您应该能够使用类的公共方法来测试它。如果私有/受保护的访问中隐藏了重要的功能,则可能表明它可以重构为另一个类。
您是否可以将复杂的私有方法重构为另一个可以单独测试的类?
请记住,测试您的私有方法将使您的测试对于实现类的行为的方式的更改更加脆弱,即使类本身的行为没有改变。例如,在进行优化重构时,很可能就是这种情况。
编辑: 假设您在基本级别上使用JavaScript,有几种方法可以实现您的目标,例如您发布的解决方案使方法受到保护并使用子类进行测试,或者通过一些变通的方法公开,临时或永久使用,但是以任何形式这样做几乎是不明智的。我强烈建议您阅读以下链接,该链接提供了有关这样做的坏主意的更多信息,并为您遇到的问题提供了潜在的好的解决方案: https://enterprisecraftsmanship.com/2017/10/23/unit-testing-private-methods/
答案 1 :(得分:1)
我的解决方案是使函数“受保护”,并在测试文件内的类中扩展该类,并公开这些功能。
示例:
class ClassToTest {
protected add(x: number, y: number}: number {
return x + y;
}
}
在测试文件中:
class PublicClassToTest extends ClassToTest {
public add(x: number, y: number): number {
return super.add(x, y);
}
}
describe('ClassToTest', () => {
const obj = new PublicClassToTest();
it('adding 2 numbers', () => {
// GIVEN x is 6
const x = 6;
// AND y is 2
const y = 2;
// WHEN we add them
const result = obj.add(x, y);
// THEN the result is 8
expect(result).toBe(8);
});
});
作为一项额外功能:这不仅解决了我的问题,而且还为我提供了一种很好的方式,使我可以从测试文件中查看函数头,而无需来回切换在我的测试和我正在测试的班级之间。