reactjs - Jest 模拟模块解析变量值

标签 reactjs testing promise jestjs

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

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

我已经尝试过不同的东西。首先将模拟包装在一个函数中,并将响应作为参数给出。 --> 失败,因为 mocks 不能取出范围外的变量。

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

我试过

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

然后调用 mockResponse.mockReturnValueOnce(value)。

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

最佳答案

您可以使用 jest.fn 在顶层创建默认模拟函数。创建模拟后,您可以使用 mockImplementation 覆盖测试用例中函数的实现。或 mockImplementationOnce .您可以在 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
      }
    })
  );
});

关于reactjs - Jest 模拟模块解析变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54392970/

相关文章:

javascript - ReactJS:如果变量更改值则重新加载组件

javascript - 如何在javascript中测试var中的函数

javascript - 返回带 .then() 和不带 .then() 的 Promise 有什么区别?

node.js - 如何释放nodeJS Q promise 链中的资源并返回 promise ?

javascript - 如何在 javascript/typescript 中 promise 一个具有多个动态变量的映射函数

javascript - 全屏组件 ReactJS

reactjs - Redux 和保存数据?

javascript - 使用 react.js 显示 Bootstrap 导航栏

java - 如何控制android平台上进程中运行的线程

testing - 测试驱动开发 : Void methods