【发布时间】:2021-10-30 21:34:53
【问题描述】:
我已经为 Axios 创建了一个可用的 Mock:
// __mocks__/axios.js
// Based on https://jestjs.io/docs/manual-mocks
const axios = jest.createMockFromModule("axios");
const log = console.log.bind(console);
axios.create = () => {
log(`Running axios.create`);
return {
get: () => {
log(`Running get`);
return {
status: 500,
statusText: "Internal Server Error",
body: {
onFire: "Mock API response from mock axios module",
},
};
},
};
};
module.exports = axios;
这在我的测试中运行良好 - 模拟自动加载并且“抛出错误”测试有效:
describe(`getLatestPrice`, () => {
it(`throws an error when the response is bad`, async () => {
expect(() => {
log(`Should throw`);
return getLatestPrice(assetCode);
}).toThrow();
});
it(`gets a single price by stream code`, async () => {
// Disabling the mock isn't working
jest.unmock("axios");
const price = await getLatestPrice(assetCode);
log(`price`, price);
expect(price).toEqual({
...
});
});
})
但是第二个测试 - 调用 jest.unmock() - 仍然使用模拟库。
如何禁用单个测试的模拟?
更新:阅读https://github.com/facebook/jest/issues/2649 我也尝试使用requireActual() 覆盖模拟:
const actualAxios = jest.requireActual("axios");
const mockAxios = require("axios");
mockAxios.create = actualAxios.create;
但是对axios.create() 的调用仍然涉及模拟。
【问题讨论】:
-
自我注意:阅读jestjs.io/docs/manual-mocks#mocking-user-modules “要退出此行为,您需要在应该使用实际模块实现的测试中显式调用 jest.unmock('moduleName')。” - unmock() 似乎并没有像我想的那样取消模拟模块,而是改变了将要使用的模拟。
-
看起来这可能是不可能的:github.com/facebook/jest/issues/2649
标签: javascript unit-testing axios jestjs