鉴于以下带有基本测试的示例,我希望 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/