Mock使用Jest导出常量箭头函数



给定以下带有基本测试的示例,我希望在用Jest模拟sendMessage.message时返回bar。相反,当被调用时,它会返回"Hello World"的原始值。

serviceBus.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导入后的绑定函数,默认情况下返回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

因此,名为的内部函数不能被嘲笑或监视。要解决此问题,您需要创建一个服务对象,并将其导出。

serviceBus.js

const message = () => {
return "Hello world";
};
const foo = () => {
return services.message();
};
const services = {
message,
foo
};
export default services;

mockDemo.test.js

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");
});
});

您应该使用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");
});
});

最新更新