首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JestJS中测试私有方法

在JestJS中测试私有方法
EN

Stack Overflow用户
提问于 2019-03-13 17:32:12
回答 2查看 5.8K关注 0票数 7

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

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

我如何为测试目的访问这些函数,但仍然强制私有访问(作为良好实践)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-13 17:46:20

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

是否有可能将复杂的私有方法重构为另一个类(Es),然后可以单独测试?

请记住,即使类本身的行为没有改变,测试私有方法也会使您的测试对实现类行为的方式的变化更加脆弱。例如,在为优化进行重构时,这种情况很可能发生。

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

票数 6
EN

Stack Overflow用户

发布于 2019-03-13 18:19:01

我的解决方案是使函数“受保护”,并在测试文件中的类中扩展该类,并公开这些函数。

示例:

代码语言:javascript
复制
class ClassToTest {
    protected add(x: number, y: number}: number {
        return x + y;
    }
}

在测试文件中:

代码语言:javascript
复制
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);
    });
});

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55148009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档