开玩笑:仅在CI上使用模块模拟,并在本地使用原始实现

问题描述 投票:0回答:1

我是writing a Bluetooth library,正在用Jest测试它。对于我的测试,我正在进行实际的无线电通信,以确保一切均正常运行。但是,此类测试无法在CI系统上运行。因此,对于我的CI系统(仅限我的CI系统),我想使用模拟。对于本地开发,我不想模拟任何东西。

所以我试图有条件地嘲笑一个模块:

import MyModule from "./myModule";

if (true) {
  jest.mock("./myModule");
}

describe("MyModule", () => {
  let myModule;

  beforeEach(() => {
    myModule = new MyModule();
  });

  test("I am NOT mocked", () => {
    expect(myModule.powerOn()).toBe("I am the original implementation");
  });

  test("I am mocked", () => {
    if (myModule.powerOn.mockReturnValueOnce)
      myModule.powerOn.mockReturnValueOnce("I am a mock");
    expect(myModule.powerOn()).toBe("I am a mock");
  });
});

但是那不起作用。我的测试结果是

 FAIL  ./index.test.js
  MyModule
    ✓ I am NOT mocked (3ms)
    ✕ I am mocked (6ms)

  ● MyModule › I am mocked

    expect(received).toBe(expected) // Object.is equality

    Expected: "I am a mock"
    Received: "I am the original implementation"

      19 |     if (myModule.powerOn.mockReturnValueOnce)
      20 |       myModule.powerOn.mockReturnValueOnce("I am a mock");
    > 21 |     expect(myModule.powerOn()).toBe("I am a mock");
         |                                ^
      22 |   });
      23 | });
      24 | 

      at Object.toBe (index.test.js:21:32)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 passed, 2 total
Snapshots:   0 total

一旦删除if子句

if (true) {
  jest.mock("./myModule");
}

jest.mock("./myModule");

它按预期工作。

您可以在这里尝试

https://github.com/LukasBombach/jest-conditionally-mock-module-example

我无法将其放在CodeSanbox中,因为此代码将其破坏了。

我已经读到,开玩笑需要在文件的根范围内进行模块模拟,因为它在运行文件之前先解析文件并对文件进行魔术处理。 我知道

但是由于似乎不可能将jest.mock放在if子句中,还有其他方法可以使CI使用模拟并在本地实现实际实现吗?

mocking jestjs
1个回答
0
投票

确定,我自己找到了解决方案。有a related question to this here,但我发现了另一个我更喜欢的解决方案。您可以使用第二个参数(工厂)来决定要返回模拟还是实际的模块

亲自看看

import MyModule from "./myModule";

jest.mock("./myModule", () => {
  if (false) return jest.requireActual("./myModule");
  return jest.genMockFromModule("./myModule");
});

describe("MyModule", () => {
  const myModule = new MyModule();

  test("I am the original", () => {
    expect(myModule.powerOn()).toBe("I am the original implementation");
  });

  test("I am mocked", () => {
    myModule.powerOn.mockReturnValueOnce("I am a mock");
    expect(myModule.powerOn()).toBe("I am a mock");
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.