我在我的服务器端应用程序中使用 Jest 和 Supertest。我希望通过明显测试每条未覆盖的线路来增加测试的覆盖范围,直到我被这个阻止:
Activity.find()
.then((data) => {
res.json(data);
}).catch(e => res.status(400).send(e));
如果我无法在测试中重现此类错误(或者至少我不知道如何),我该如何测试 catch 子句?
在单元测试中,您应该只测试您的代码,而不应该依赖第三方库。当然,这个建议应该合理应用(例如,我们必须依赖于我们正在使用的平台的编译器和开箱即用库)。
到目前为止,不存根似乎是合理的
json
,因为它是一个值得信赖的成熟库。但是,一旦您想要测试抛出异常之类的行为,除了创建一个存根,将其以某种方式注入到您的代码中,并在测试设置中使其在调用 json
时抛出异常,就没有其他方法了。
作为副作用,这会将您的代码与
json
的特定实现解耦,并使您的代码更加灵活。当然,与 JSON 实现解耦似乎有点过头了,但仍然显示了测试驱动设计在这种情况下是如何工作的(即使代码是第一个)。
您可以通过存根方法来模拟 catch 情况。首先,您应该存根 Activity 的 find 方法,然后使其抛出错误。 如果您使用的是 sinon;
sinon.stub(Activity, "find").rejects(new Error("Simulated Error!)
可能是开玩笑;
jest.spyOn(Activity, "find").mockRejectedValue(new Error("Simulated Error!)
之后,通过超级测试,您可以测试您的端点;
const res = await request(app).get('/your-route')
expect(res.statusCode).toEqual(500)
expect(res.body).toEqual(new Error("Simulated Error!"))
expect(res.body.message).toEqual("Simulated Error!")
通过这种方式,您可以通过模拟来测试捕获案例并增加覆盖范围。