代码之家  ›  专栏  ›  技术社区  ›  Lukas

Jest:仅在CI上使用module mock,并在本地使用原始实现

  •  0
  • Lukas  · 技术社区  · 5 年前

    我是 writing a Bluetooth library 我在开玩笑。为了我的测试,我正在做实际的无线电通讯,以确保一切都能正常工作。但是,此类测试不能在CI系统上运行。所以对于我的CI系统,以及我的CI系统,我想使用mock。对于当地的发展,我不想嘲笑任何事情。

    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 (true) {
      jest.mock("./myModule");
    }
    

    jest.mock("./myModule");
    

    它按预期工作。

    你可以在这里试试

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

    我已经读到jest需要在文件的根作用域中有模块mock,因为它在运行文件之前解析文件并对其执行一些魔法。 我知道这个 .

    但既然看起来不可能 jest.mock 在if子句中,有没有其他方法可以让CI使用mock并在本地处理我的实际实现?

    0 回复  |  直到 5 年前
        1
  •  0
  •   Lukas    5 年前

    好吧,我自己找到了解决办法。有 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");
      });
    });