【发布时间】:2019-10-04 05:19:31
【问题描述】:
我正在为一个有很多请求的类编写集成测试。请求是通过 HttpClient 单例完成的。
所以,为了避免发出真正的请求,我模拟了对HttpClient 的所有调用。问题是,我的请求太多了。
-
调用
HttpClient.get来获取令牌。 -
调用
HttpClient.get来获取资源。 -
调用
HttpClient.get以从该资源中获取所有客户。 -
调用
HttpClient.get以验证另一个 API 中是否存在单个客户。 - 条件:调用
HttpClient.post将这个客户添加到 API(如果它不存在)。 -
调用
HttpClient.post将资源添加到另一个 API。
实际上比这要复杂一些,因为其中一些调用是多次完成的(在循环内),但你明白了。
我为每个场景编写了一个测试用例。一个测试用例模拟失败的获取令牌的请求,另一个模拟失败的获取资源的请求等等。
为此,我使用mockImplementationOnce 编写了一个“快乐”场景——一切顺利——。我的beforeEach 看起来有点像这样:
tokenResponse = { body: { token: 'some-token'}, status: 200 }
HttpClient.get.mockImplementationOnce(() => tokenResponse)
tokenResource = { body: <some-fixture-with-resources>, status: 200 }
HttpClient.get.mockImplementationOnce(() => tokenResource
(...)
为了编写场景,我重新分配了返回的变量
it('fails to fetch the token', () => {
tokenResponse = { status: 500 }
// code that calls my class
// code that asserts that an error was thrown
}
无论如何,我设法为所有场景编写了简单的测试用例,但我的beforeEach 有一个巨大的样板。除此之外,现在我想编写更高级的测试用例,其中多次完成请求(n 个客户 > 1)。处理所有固定装置和跟踪单个模拟变得相当复杂。
这是一个常见问题吗?有没有更简单的方法来处理模拟实现?我想过类似mockImplementationNth 之类的东西,但找不到任何东西。
Ps.:更改代码本身很困难,因为它是遗留代码,而且 API 有点笨拙。
【问题讨论】:
标签: javascript node.js mocking jestjs tdd