首页 > 解决方案 > 如何在每个测试中以不同方式模拟克隆的导入依赖项

问题描述

我有一个导入另一个文件的文件。我想在每个测试中以不同的方式模拟另一个导入,但通过导入它的文件显示它。

我通过谷歌搜索尝试了各种模拟和导入方法,但都没有奏效。

考虑文件:

设置.js

export default { mySetting: null };

store.js

import settings from "./settings";
export default {
  settings: { ...settings },
};

settingsDemo.js

import store from "./store";

it("default settings", () => {
  expect(store.settings.mySetting).toBe(null);
});

it("mocked to true", () => {
  expect(store.settings.mySetting).toBe(true);
});

it("mocked to false", () => {
  expect(store.settings.mySetting).toBe(false);
});

我如何在其中模拟这些文件settingsDemo.js以使所有 3 个测试都通过而不进行编辑settings.jsstore.js

注意:这与我之前的问题类似,但是在这种情况下,导入依赖项和更改值的解决方案不起作用,因为这里store没有引用settings对象,而是将其克隆为初始值。

标签: unit-testingecmascript-6mockingjestjs

解决方案


同样的原则也适用:“虽然您不能更改导入的值,但您可以更改它们所指的对象。”

在这种情况下store,是一个包含嵌套对象的settings对象。虽然不可能简单地分配store给其他东西,但可以分配store.settings给其他东西。也可以设置store.settings.mySetting为其他内容:

import store from "./store";

it("default settings", () => {
  expect(store.settings.mySetting).toBe(null);  // SUCCESS
});

it("mocked to true", () => {
  store.settings = { mySetting: true };  // set store.settings to something else
  expect(store.settings.mySetting).toBe(true);  // SUCCESS
});

it("mocked to false", () => {
  store.settings.mySetting = false;  // set store.settings.mySetting to something else
  expect(store.settings.mySetting).toBe(false);  // SUCCESS
});

推荐阅读