开玩笑的模拟模块用可变值解析

时间:2019-01-27 21:19:45

标签: reactjs testing promise jestjs

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

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)。

尚未成功。有人看到出路了吗?

2 个答案:

答案 0 :(得分:1)

您可以使用jest.fn在顶层创建默认的模拟函数。创建模拟后,您可以使用mockImplementationmockImplementationOnce在测试用例中覆盖该函数的实现。您可以在Jest documentation中找到有关此信息的更多信息。

import request from '../request';

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

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

答案 1 :(得分:0)

带有打字稿的答案将是:

import request from '../request';

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

test("MyTest", () => {
    (request as jest.Mock).mockImplementationOnce(() =>
        Promise.resolve({
            response: {
                ok: true
            }
        })
    );
});