Jest-如何模拟构造函数接受参数的服务



我在启动NodeJS应用程序时有这样的逻辑:

const twiddleService = new twiddleService(
new twiddleClient(),
new UserRepository(),
new BusinessRepository()
);
const twiddleController = new twiddleController(twiddleService);

我已经通过嘲笑twidleClient对twidleService进行了单元测试。

现在我想对twidleController和mock twidleService进行单元测试。

在我的twidleController.test.ts文件中,我有

import { twiddleService } from '../../src/services/twiddle-service';
jest.mock('../../src/services/twiddle-service');
const twiddleController = new twiddleController(new twiddleService());

显然这不起作用,因为twidleService需要3个参数。我可以再次嘲笑twidleClient和存储库,但理想情况下我不会。

基本上,我的目标是能够做一些类似的事情

jest.spyOn(TwiddleService, 'createBananas').mockResolvedValue('b');

这样我就可以对我的控制器进行单元测试。

解决这个问题的最佳实践是什么?

[我也在使用打字稿]

我认为您根本不需要在twiddle-service上导入并调用jest.mock

由于您使用依赖注入将twiddleService实例提供给twiddleController构造函数,因此您的测试可以向new twiddleController()调用提供一个简单的对象——当然符合Twiddle Service的接口。您可以将jest.fnimplementation参数一起使用,以定义服务的createBananas方法向twiddleController实例返回的内容。由此产生的测试如下所示:

describe("TwiddleController", () => {
test("calls createBananas method of twiddleService instance", () => {
const mockTwiddleService = {
createBananas: jest.fn(() => "b"),
};
const twiddleController = new TwiddleController(mockTwiddleService);
expect(twiddleController.doSomethingWithBananas()).toBe("b");
});
});

最新更新