javascript - 用 Jest 模拟导出的 const 箭头函数

标签 javascript jestjs

鉴于以下带有基本测试的示例,我希望 bar返回时 sendMessage.message被 Jest mock 。相反,当被调用时,它返回“Hello World”的原始值。

服务总线.js

export const message = () => {
  return "Hello world";
};

export const foo = () => {
  return message();
};

mockDemo.test.js

import * as sendMessage from "../src/services/serviceBus";

describe("sendMessage", () => {
  sendMessage.message = jest.fn(() => {
    return "bar";
  });

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});

结果如下:

$ ./node_modules/.bin/jest ./__tests__/mockDemo.test.js
 FAIL  __tests__/mockDemo.test.js
  MessageReceiver Router
    ✕ message should return bar (9ms)

  ● MessageReceiver Router › message should return bar

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

    Expected: "bar"
    Received: "Hello world"

       9 |   it(`message should return bar`, async () => {
      10 |     expect(sendMessage.message()).toBe("bar");
    > 11 |     expect(sendMessage.foo()).toBe("bar");
         |                               ^
      12 |   });
      13 | });
      14 |

      at Object.<anonymous> (__tests__/mockDemo.test.js:11:31)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total

看起来好像sendMessage.foo正在调用 message 导入后的绑定(bind)函数,默认返回 Hello World .

如何模拟 message在这种情况下?

更新

使用 jest.fn().mockImplementation(() => "bar");导致相同的行为:

describe("MessageReceiver Router", () => {
  //   sendMessage.message.mockImplementation = jest.fn(() => {
  //     return "bar";
  //   });

  sendMessage.message = jest.fn().mockImplementation(() => "bar");

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});

结果:
$ ./node_modules/.bin/jest ./__tests__/mockDemo.test.js
 FAIL  __tests__/mockDemo.test.js
  MessageReceiver Router
    ✕ message should return bar (10ms)

  ● MessageReceiver Router › message should return bar

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

    Expected: "bar"
    Received: "Hello world"

      11 |   it(`message should return bar`, async () => {
      12 |     expect(sendMessage.message()).toBe("bar");
    > 13 |     expect(sendMessage.foo()).toBe("bar");
         |                               ^
      14 |   });
      15 | });
      16 |

      at Object.<anonymous> (__tests__/mockDemo.test.js:13:31)

Test Suites: 1 failed, 1 total
Tests:       1 failed, 1 total
Snapshots:   0 total
Time:        2.175s

最佳答案

您应该使用 spyOn模拟 sendMessage.message 的方法方法。

import * as sendMessage from "../src/services/serviceBus";

describe("sendMessage", () => {
   jest.spyOn(sendMessage, 'message').mockReturnValue("bar")

  it(`message should return bar`, async () => {
    expect(sendMessage.message()).toBe("bar");
    expect(sendMessage.foo()).toBe("bar");
  });
});

关于javascript - 用 Jest 模拟导出的 const 箭头函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60284845/

相关文章:

javascript - 关闭应用程序时如何在 cordova 中执行一段代码

javascript - HTML5 Canvas 和 javascript 奖轮

javascript - 传单:使用复选框切换 GeoJSON 图层

javascript - 测试 React 项目时 npm test 有效,但 jest 不起作用

javascript - ShallowWrapper::setState() 只能在类组件上调用

javascript - 拒绝加载字体 'data:font/woff.....' 它违反了以下内容安全策略指令 : "default-src ' self '". Note that ' font-src'

Javascript:如何声明非全局静态方法?

javascript - 如何使用 sinon 在被测函数内 stub 类方法?

unit-testing - 模拟和监视键盘事件,并在 native 中开 Jest

reactjs - Material UI + React 测试库 : Unit test Select MenuItem breaks after upgrading to version 4