首页 > 解决方案 > 玩笑模拟模块解析变量值

问题描述

假设我有一个返回承诺的模块。我想模拟这个承诺的不同结果来测试这个模块所在的功能。我像这样模拟模块:

jest.mock('../request', () => {
    return () => new Promise((resolve, reject) => {
        return resolve({
            response: { ok: true }
        });
    });
});

我的第一个测试正在运行

test("The function resolves", () => {
  const initialState = { apiData: getState("postData", {}, "ready", "POST") };
  const store: any = mockStore(initialState);
  return expect(
    performApiRequest("postData/", {}, { data: "json" })(dispatch, () =>
      store.getState()
    )
  ).resolves.toBeUndefined();
});

现在的问题是测试另一个函数,其中解析的值应该不同,例如 {response: { ok: false } }。

我已经尝试了不同的东西。首先将模拟包装在一个函数中并将响应作为参数提供。--> 模拟失败不能超出范围变量。

我试图在测试中调用 jest.doMock 但这不会正确触发请求。

我试着做

const mockResponse = jest.fn();
jest.mock("../request", () => {
  return () =>
    new Promise((resolve, reject) => {
      return resolve({
        mockResponse
      });
    });
});

然后调用 mockResponse.mockReturnValueOnce(value)。

还没有成功。有人看到出路吗?

标签: reactjstestingpromisejestjs

解决方案


您可以使用jest.fn. mockImplementation创建模拟后,您可以使用或覆盖测试用例中函数的实现mockImplementationOnce您可以在 Jest文档中找到有关此的更多信息。

import request from '../request';

jest.mock("../request", () =>
  jest.fn(() =>
    Promise.resolve({
      response: {
        ok: true
      }
    })
  )
);

test("MyTest", () => {
  request.mockImplementationOnce(() =>
    Promise.resolve({
      response: {
        ok: false
      }
    })
  );
});

推荐阅读