gpt4 book ai didi

javascript - 检查单元测试中是否调用了函数

转载 作者:行者123 更新时间:2023-11-30 14:55:34 25 4
gpt4 key购买 nike

你好,我正在尝试用 Jest 为我编写的模块编写一些单元测试,但目前有点卡住了,需要一些如何继续的建议。

export const submitOrder = async (body, key) => {
const clientRepo = new ClientRepository(db)
const companyRepo = new CompanyRepository(db)

const company = await getCompanyByKey(
companyRepo,
key
);

const client = await createClient(
clientRepo,
body
);

await addClientToCompany(
companyRepo,
client.id,
company.id
);

.. More things
}

我可以通过传递模拟存储库轻松测试每个函数(getCompanyByKeycreateClientaddClientToCompany)。

但我还想测试 submitOrder 函数的“流程”,方法是检查我的存储库函数是否已被调用。但是我随后需要每个存储库的实例,直到我的 submitOrder 函数我才实例化它。

类似这样的事情,这与我对函数进行单元测试的方式类似。

jest.mock('../repositories/ClientRepository');
jest.mock('../repositories/CompanyRepository');

test('should be able to submit an order', async () => {
const apiKey = 'mocked-super-key';
const body = getMockData();

const result = await submitOrder(body, apiKey);
expect(result).toMatchSnapshot();
expect(CompanyRepository.findByKey).toHaveBeenCalled();
expect(ClientRepository.create).toHaveBeenCalled();
expect(CompanyRepository.addClient).toHaveBeenCalled();
});

关于我如何测试我的存储库是否已被调用,您有什么提示吗?

最佳答案

您描述的问题是依赖注入(inject)背后的激励因素之一。

作为单个示例:您的submitOrder() 代码使用new 直接实例化特定实现ClientRepository 的客户端存储库。相反,它可以声明它具有依赖性——它需要一个实现客户端存储库接口(interface)的对象。然后它可以允许周围环境提供这样的对象(流行语中的“依赖注入(inject)容器”)。然后在测试期间,您将创建并提供(“注入(inject)”)一个模拟实现而不是真正的实现。

这还有一个额外的好处,即如果您必须能够在多个“真实”实现之间进行选择,那么您也已经准备好这样做了。

有很多方法可以实现这一点。它可以像设计模式一样简单,或者对于更完整的解决方案,您可以使用依赖项注入(inject)框架。

如果您绝对不能为此实践重构您的代码,那么 JavaScript 足够动态,您可以拼凑出一种方法来拦截 new 的调用,从而模拟依赖注入(inject)。

关于javascript - 检查单元测试中是否调用了函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47332138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com