在JestJS中测试私有方法

问题描述 投票:2回答:2

我正在使用NestJS(使用TypeScript)创建API,它使用JestJS作为默认测试框架。我正在为服务类编写一个测试,我正在尝试访问它的私有函数(使用TypeScript强制执行),但我不能出于显而易见的原因。

其他语言(如Java)中的传统解决方案是将函数更改为包或内部范围,但这在TypeScript中不存在。

我如何访问这些功能以进行测试,但仍然强制执行私有访问(作为良好实践)?

typescript unit-testing jestjs private-members nestjs
2个回答
4
投票

作为指导,您应该能够使用其公共方法测试类。如果在私有/受保护的访问中隐藏了重要的功能,那么它可能是一个信号,它可以被重构到另一个类中。

您是否有可能将复杂的私有方法重构为另一个可以单独测试的类?

请记住,测试私有方法会使您的测试更容易实现类实现行为的更改,即使类本身的行为没有改变也是如此。例如,在重构优化时很可能就是这种情况。

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


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

作为一个额外的功能:这不仅解决了我的问题,而且还提供了一个很好的方式让我从测试文件中查看我的函数头,而无需在我的测试和我正在测试的类之间来回切换。

© www.soinside.com 2019 - 2024. All rights reserved.