我正在使用NestJS(使用TypeScript)创建API,它使用JestJS作为默认测试框架。我正在为服务类编写一个测试,我正在尝试访问它的私有函数(使用TypeScript强制执行),但我不能出于显而易见的原因。
其他语言(如Java)中的传统解决方案是将函数更改为包或内部范围,但这在TypeScript中不存在。
我如何访问这些功能以进行测试,但仍然强制执行私有访问(作为良好实践)?
作为指导,您应该能够使用其公共方法测试类。如果在私有/受保护的访问中隐藏了重要的功能,那么它可能是一个信号,它可以被重构到另一个类中。
您是否有可能将复杂的私有方法重构为另一个可以单独测试的类?
请记住,测试私有方法会使您的测试更容易实现类实现行为的更改,即使类本身的行为没有改变也是如此。例如,在重构优化时很可能就是这种情况。
编辑:鉴于您在基础级别使用JavaScript,有几种方法可以实现您的目标,例如您发布的解决方案使方法受到保护并使用子类进行测试,或者通过一些变体来实现公共,临时或永久的方法,但以任何形式这样做几乎肯定是不明智的。我强烈建议您阅读以下链接,该链接提供了有关为什么这样做的好主意的更多信息,并且还为您遇到的问题提供了可能很好的解决方案:https://enterprisecraftsmanship.com/2017/10/23/unit-testing-private-methods/
我的解决方案是使函数“受保护”并在测试文件中的类中扩展类,并公开这些函数。
例:
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);
});
});
作为一个额外的功能:这不仅解决了我的问题,而且还提供了一个很好的方式让我从测试文件中查看我的函数头,而无需在我的测试和我正在测试的类之间来回切换。