如果在测试过程中无法重现错误,如何测试catch子句?

问题描述 投票:0回答:2

我在我的服务器端应用程序中使用 Jest 和 Supertest。我希望通过明显测试每条未覆盖的线路来增加测试的覆盖范围,直到我被这个阻止:

Activity.find()
    .then((data) => {
        res.json(data);
    }).catch(e => res.status(400).send(e));

如果我无法在测试中重现此类错误(或者至少我不知道如何),我该如何测试 catch 子句?

node.js unit-testing mongoose jestjs supertest
2个回答
0
投票

在单元测试中,您应该只测试您的代码,而不应该依赖第三方库。当然,这个建议应该合理应用(例如,我们必须依赖于我们正在使用的平台的编译器和开箱即用库)。

到目前为止,不存根似乎是合理的

json
,因为它是一个值得信赖的成熟库。但是,一旦您想要测试抛出异常之类的行为,除了创建一个存根,将其以某种方式注入到您的代码中,并在测试设置中使其在调用
json
时抛出异常,就没有其他方法了。

作为副作用,这会将您的代码与

json
的特定实现解耦,并使您的代码更加灵活。当然,与 JSON 实现解耦似乎有点过头了,但仍然显示了测试驱动设计在这种情况下是如何工作的(即使代码是第一个)。


0
投票

您可以通过存根方法来模拟 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!")

通过这种方式,您可以通过模拟来测试捕获案例并增加覆盖范围。

© www.soinside.com 2019 - 2024. All rights reserved.