Javascript 为什么赢了';难道这些笑话不会被重置吗?
我有影响其他测试并导致它们失败的测试代码。当我孤立地运行测试用例时,一切都通过了,但是当我运行整个程序时,有很多失败。如果您查看下面的两个测试,您可以看到我覆盖了测试中的模拟模块,从而引发异常Javascript 为什么赢了';难道这些笑话不会被重置吗?,javascript,unit-testing,testing,redux,jestjs,Javascript,Unit Testing,Testing,Redux,Jestjs,我有影响其他测试并导致它们失败的测试代码。当我孤立地运行测试用例时,一切都通过了,但是当我运行整个程序时,有很多失败。如果您查看下面的两个测试,您可以看到我覆盖了测试中的模拟模块,从而引发异常 HttpService.post = jest.fn(() => { return Promise.reject({ payload: 'rejected' }); }); 运行此行后,所有需要原始HttpService.postmock的测试都会失败,因为它们没有被重置。在测试之后,我如何
HttpService.post = jest.fn(() => {
return Promise.reject({ payload: 'rejected' });
});
运行此行后,所有需要原始HttpService.post
mock的测试都会失败,因为它们没有被重置。在测试之后,我如何正确地将我的模拟恢复到导入的模拟?我尝试过使用beforeach和几乎每一种类似的jest方法,但是没有任何效果。我知道答案可能是直截了当的,但我对我在网上看到的关于如何导入代码的所有差异感到困惑(es6导入,commonJs)。谢谢
如果导入的模块是对象,则需要单独模拟每个导出的函数:
import HttpService from '../../services/httpService';
jest.mock('../../services/httpService', ()=>({
post: jest.fn()
});
稍后,您可以像这样设置模拟的行为
HttpService.post.mockImplementation(()=>Promise.reject({ payload: 'rejected' }))
和重置
HttpService.post.mockReset()
我也有类似的问题。事实证明,这就是问题所在,将Jest升级到至少23.0.0版解决了问题。在撰写本文时,23.6是Jest的最新稳定版本
在我的例子中,
mockRejectedValueOnce
似乎没有被重置,因为当我在以前的测试中注释掉mockRejectedValueOnce
方法时,我后面的测试(有问题的测试)再次工作。因此,重置方法无效。如果您想对文件中的某些测试模拟模块(使用模拟工厂),但对其他测试取消模拟模块,则此方法对我有效:
describe("some tests", () => {
let subject;
describe("with mocks", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.doMock("some-lib", () => ({ someFn: jest.fn() })); // doMock isnt hoisted with babel
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is mocked
});
describe("without mocks - restoring mocked modules", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.unmock("some-lib");
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is NOT mocked
});
});
感谢您迄今为止的帮助,这还不起作用。我有HttpService.post mock,正如您在mocks文件夹中描述的手动mock。模拟仍然不会返回到我提供的实现。您是否有这样的代码与我使用的导入语法一起工作?谢谢@Andreas当我记录HttpService.post时,你会得到什么?如果我记录HttpService.post,它会在重置前后说这是一个笑话模拟,但是如果调用并记录HttpService.post()在重置之前说
承诺{{payload:'rejected'}
重置后未定义
它不会从mocks文件夹中设置回实现,知道如何修复它吗?也许mockRestore()
就是你要找的
describe("some tests", () => {
let subject;
describe("with mocks", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.doMock("some-lib", () => ({ someFn: jest.fn() })); // doMock isnt hoisted with babel
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is mocked
});
describe("without mocks - restoring mocked modules", () => {
beforeAll(() => {
jest.isolateModules(() => {
jest.unmock("some-lib");
subject = require('./module-that-imports-some-lib');
});
});
// ... tests when some-lib is NOT mocked
});
});