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

  });
});