调用供应商Web服务的单元测试方法


10

我有一类具有一个公共方法Send()和一些私有方法的类。它调用几个Web服务并处理响应。该处理以私有方法完成。

我想对代码进行单元测试。我的理解是,单元测试应该单独测试我的代码(即模拟供应商的响应)。

我还认为私有方法不需要进行单元测试,但是如果我仅测试Send()方法,我的代码就不会被单独测试,而取决于供应商的共鸣。

然后是否应该将我的私有方法公开,以便可以通过模拟响应对其进行测试?这似乎是不好的做法,因为我只有全班同学才需要给他们打电话。

道歉,如果这是一个基本问题,对单元测试来说还很新。

我正在使用C#和VS2010


如果您不测试私有方法,您如何知道它是否有效?
布莱恩·奥克利

1
@BryanOakley您不需要知道私有方法有效,它是私有的。您知道它有效,因为调用它的公共方法通过了测试。
StuperUser 2011年

@Bryan Oakley看一下链接
Tom Squires

汤姆,您好,我已经更新了链接,使其更加突出,并使链接文本反映了目标。请随时回滚。
StuperUser 2011年

Answers:


18

您应该将处理Web服务的代码(即发送和接收数据)与处理结果的代码分开。将后面的代码移到不同的类中,使必要的方法公开。然后,您可以轻松地对处理逻辑进行单元测试,而无需外部依赖项。

这样,您还可以使代码符合“ 单一责任原则”。根据一般经验,感觉需要测试私有方法通常表明该类承担了太多责任,因此应将其重构为多个类。


3

我认为具有这种依赖关系的测试(称为供应商webservices)是集成测试,而不是单元测试。


3

正如其他人所述,如果您的单元测试具有外部依赖性,例如Web服务或数据库调用,那么它们根本不是单元测试,它们是集成测试。

真正的单元测试可以独立于要测试的组件之外的外部组件运行,并且无论环境如何都应该可以重复。如果外部Web服务出现故障,则单元测试应该不会失败。

我们使用模拟框架来解决这个问题。模拟对象允许我们创建组件的模拟,以便我们的单元测试中的组件使用这些模拟对象而不是真实的对象。我们可以将模拟对象注入到可测试的组件中,并指定期望的参数,调用时希望返回的参数,甚至希望抛出的异常。我强烈建议您阅读更多有关该主题的内容,因为它可以提高单元测试的可靠性和独立性。

有关不同的C#模拟框架的文章,请参见以下SO线程:

/programming/37359/what-c​​-mocking-framework-to-use

编辑: 出于明显的敏感度,我将忽略提及DbUnit或其他可以在测试结束时回滚数据库更改的事务性工具的事实。这些也是可重复的,并且对于生成的测试数据可能是与环境无关的,因此在这种情况下不需要模拟框架。


有人可以解释一下反对意见吗?我没有在PHP,ROR,NoSQL数据库,服务器上的Javascript,Apple产品或任何其他fab趋势上
大放异彩,但

我猜有人不喜欢将其单元测试称为“根本不是单元测试”(不是我):)
Daniel B
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.