我正在使用NestJS (使用TypeScript)创建一个API,它使用JestJS作为默认的测试框架。我正在为一个服务类编写一个测试,我试图访问它的私有函数(用TypeScript强制执行),但由于明显的原因,我不能访问它。
其他语言(如Java)中的传统解决方案是将函数更改为包或内部作用域,但这在TypeScript中并不存在。
我如何为测试目的访问这些函数,但仍然强制私有访问(作为良好实践)?
发布于 2019-03-13 17:46:20
作为指导原则,您应该能够使用类的公共方法来测试它。如果在私有/受保护的访问中隐藏了重要的功能,那么它可能是一个信号,表明可以将其重构到另一个类中。
是否有可能将复杂的私有方法重构为另一个类(Es),然后可以单独测试?
请记住,即使类本身的行为没有改变,测试私有方法也会使您的测试对实现类行为的方式的变化更加脆弱。例如,在为优化进行重构时,这种情况很可能发生。
编辑:考虑到您在基本级别上使用JavaScript,有几种方法可以实现您的目标,例如您发布的使这些方法受到保护并使用子类进行测试的解决方案,或者通过将这些方法公开、临时或永久地进行某种形式的更改,但是以任何形式这样做几乎肯定是不明智的。我强烈建议阅读下面的链接,该链接提供了关于为什么这样做是个坏主意的进一步信息,并提供了解决问题的潜在好方案:https://enterprisecraftsmanship.com/2017/10/23/unit-testing-private-methods/
发布于 2019-03-13 18:19:01
我的解决方案是使函数“受保护”,并在测试文件中的类中扩展该类,并公开这些函数。
示例:
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);
});
});作为一个额外的特性:不仅解决了我的问题,而且还为我提供了一种很好的方式来查看测试文件中的函数头,而不需要在测试和正在测试的类之间来回切换。
https://stackoverflow.com/questions/55148009
复制相似问题