【发布时间】:2017-02-06 21:39:07
【问题描述】:
我尝试在 Jest 中测试以下模块:
// myModule.js
export function otherFn() {
console.log('do something');
}
export function testFn() {
otherFn();
// do other things
}
如上所示,它导出了一些命名函数,重要的是testFn 使用了otherFn。
在我为testFn 编写单元测试时开玩笑,我想模拟otherFn 函数,因为我不希望otherFn 中的错误影响我对testFn 的单元测试。我的问题是我不确定最好的方法:
// myModule.test.js
jest.unmock('myModule');
import { testFn, otherFn } from 'myModule';
describe('test category', () => {
it('tests something about testFn', () => {
// I want to mock "otherFn" here but can't reassign
// a.k.a. can't do otherFn = jest.fn()
});
});
感谢任何帮助/见解。
【问题讨论】:
-
我不会这样做。无论如何,嘲笑通常不是您想做的事情。如果您需要模拟某些东西(由于进行服务器调用/等),那么您应该将
otherFn提取到一个单独的模块中并模拟它。 -
@kentcdodds,您能否澄清一下“Mocking 通常不是您想要做的事情”的意思?这似乎是一个相当宽泛(过于宽泛?)的陈述,因为嘲笑肯定是经常使用的东西,大概是出于(至少某些)充分的理由。那么,您可能是指为什么在 此处 模拟可能不好,还是您的意思是一般意义上的?
-
通常模拟是测试实现细节。尤其是在这个级别上,它导致的测试并没有真正验证您的测试是否有效(而不是您的代码有效)这一事实。
-
我正准备称第一个评论者为白痴,然后才意识到他是谁。不过,这条评论让我很困惑。首先,模拟对于测试现代应用程序至关重要。另外,我也有同样的情况,把函数分成单独的模块是没有意义的。
-
为了记录,自从几年前写这个问题以来,我已经改变了我想要做多少嘲笑(并且不再像这样嘲笑)的态度。这些天来,我非常同意@kentcdodds 和他的测试理念(并强烈推荐他的博客和
@testing-library/react用于任何Reacters),但我知道这是一个有争议的话题。
标签: unit-testing ecmascript-6 jestjs