如何在每个测试中模拟导入依赖关系的方式不同

时间:2018-10-11 01:19:52

标签: ecmascript-6 mocking jestjs

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

我尝试了通过谷歌搜索进行各种模拟和导入的方法,但是都没有用。

考虑文件:

settings.js

export default { mySetting: null };

store.js

import settings from "./settings";
export default {
  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);
});

如何在settings.js中模拟settingsDemo.js以使所有3个测试均通过?

1 个答案:

答案 0 :(得分:1)

来自"Exploring ES6"

“在ES6中,导入是有关导出值的实时只读视图。”

“请注意,虽然您无法更改导入的值,但是可以更改它们所引用的对象。”

换句话说,无法将settings分配给其他对象,但是可以更改settings上的属性,并且这些更改将在导入的任何位置自动显示。

考虑到这一点,这是一个有效的测试:

import store from "./store";
import settings from './settings';  // import settings

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

it("mocked to true", () => {
  settings.mySetting = true;  // change the mySetting property
  expect(store.settings.mySetting).toBe(true);  // SUCCESS
});

it("mocked to false", () => {
  settings.mySetting = false;  // change the mySetting property
  expect(store.settings.mySetting).toBe(false);  // SUCCESS
});