我在启动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.fn
与implementation
参数一起使用,以定义服务的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");
});
});