鉴于以下示例具有基本测试,我希望在用Jest模拟bar
时返回sendMessage.message
。而是在调用时返回“ Hello World”的原始值。
export const message = () => {
return "Hello world";
};
export const foo = () => {
return message();
};
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
正在调用绑定函数,默认情况下返回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
答案 0 :(得分:1)
因此无法模拟或监视称为 的内部函数。要解决此问题,您需要创建服务的对象,然后将其导出。
const message = () => {
return "Hello world";
};
const foo = () => {
return services.message();
};
const services = {
message,
foo
};
export default services;
import sendMessage from "../src/services/serviceBus";
describe("MessageReceiver Router", () => {
sendMessage.message = jest.fn(() => {
return "bar";
});
it(`message should return bar`, async () => {
expect(sendMessage.message()).toBe("bar");
expect(sendMessage.foo()).toBe("bar");
});
});
答案 1 :(得分:0)
您应该使用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");
});
});