在 JestJS 中测试私有方法

Testing private methods in JestJS

我正在使用 NestJS(使用 TypeScript)制作一个 API,它使用 JestJS 作为默认测试框架。我正在为服务编写测试 class 并且我正在尝试访问它的私有函数(使用 TypeScript 强制执行),但由于明显的原因我不能。

其他语言(如Java)的传统解决方案是将函数更改为 packageinternal作用域,但这在 TypeScript 中不存在。

我如何才能出于测试目的访问这些功能,但仍强制执行私有访问(作为良好做法)?

作为准则,您应该能够使用 public 方法来测试 class。如果在 private/protected 访问权限中隐藏了重要功能,那么这可能是一个信号,表明它可以重构到另一个 class.

您是否可以将复杂的私有方法重构为另一个 class(es) 然后您可以单独测试?

请记住,测试您的私有方法会使您的测试更容易受到 class 行为实现方式变化的影响,即使 class 本身的行为尚未发生变化'改变了。例如,在重构优化时很可能会出现这种情况。

编辑: 鉴于您在基础级别使用 JavaScript ,您可以通过多种方式实现您的目标,例如您发布的解决方案使方法受到保护并使用 subclass 进行测试,或者通过使方法 public 临时或永久的一些变体,但以任何形式这样做几乎肯定是不明智的。我强烈建议您阅读以下内容 link,其中提供了有关为什么这样做不是一个好主意的更多信息,并且还为您遇到的问题提供了可能好的解决方案: https://enterprisecraftsmanship.com/2017/10/23/unit-testing-private-methods/

我的解决方案是创建函数 "protected" 并在测试文件内的 class 中扩展 class,并公开这些函数。

示例:

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);
    });
});

作为奖励功能:这不仅解决了我的问题,还为我提供了一种从测试文件中查看函数头的好方法,而无需在我的测试和我正在测试的 class 之间来回切换。