【问题标题】:How to mock a cloned imports dependency differently in each test如何在每个测试中以不同方式模拟克隆的导入依赖项
【发布时间】:2019-03-17 00:43:06
【问题描述】:

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

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

考虑文件:

settings.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 中模拟这些文件,以在不编辑 settings.jsstore.js 的情况下通过所有 3 个测试?

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

【问题讨论】:

    标签: unit-testing ecmascript-6 mocking jestjs


    【解决方案1】:

    同样的原则适用:"while you can't change the value of imports, you can change the objects that they are referring to."

    在这种情况下,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
    });
    

    【讨论】:

      【解决方案2】:

      我不确定我是否理解您的问题。听起来您只想模拟一个简单的对象
      {settings:{ mySetting: null }}”。

      let store = {settings:{ mySetting: null }}
      
      it("default settings", () => {
        store.settings.mySetting = null
        expect(store.settings.mySetting).toBe(null);
      });
      
      it("mocked to true", () => {
        store.settings.mySetting = true
        expect(store.settings.mySetting).toBe(true);
      });
      
      it("mocked to false", () => {
        store.settings.mySetting = false
        expect(store.settings.mySetting).toBe(false);
      });
      

      【讨论】:

        猜你喜欢
        • 2019-03-15
        • 2019-11-27
        • 2017-03-22
        • 2018-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-11
        • 2020-12-06
        相关资源
        最近更新 更多