单元测试:如何断言?返回断言结果或在模拟上调用方法?

时间:2013-08-02 16:03:49

标签: unit-testing mocking nunit nsubstitute

我试图找出Assert的最佳方法,我应该用我应该返回的对象创建一个对象并检查它是否等于预期的结果?

或者我应该针对模拟运行方法以确保实际调用该方法。

我已经看到过两种方式,我想知道是否有人有这方面的最佳实践。

当然,编写单元测试以断言在模拟上调用方法更快更容易但更快更容易并不总是最好的方法 - 尽管有时它可能是。

每个人都声称,已经调用了一个方法或者声明了返回的结果?

当然,在单元测试中执行多于1个断言的不是最佳实践,所以答案可能是实际断言结果并且该方法被调用了?所以我会创建2个单元测试,1个用于检查结果,1个用于检查方法是否被调用。

但是现在考虑这个,也许这太过分了,如果我得到一个结果,我想我可以假设我的模拟方法被调用了。

1 个答案:

答案 0 :(得分:1)

在测试已调用方法和测试返回的值之间是另一个可能更重要的测试:使用正确的参数调用它。

如今,一种非常常见的情况是您正在编写的方法,该方法使用一些HTTP库从REST API检索数据。您不希望在测试中实际发出HTTP请求,因此您可以模拟HTTP客户端get()方法。一方面,你的模拟可能只返回一些罐装JSON响应(如在Ruby中使用RSpec作为例子):

http_mock.stub(:get).and_return('{result: 5}')

然后测试您是否可以正确解析它并根据响应返回一些正确的值。

您还可以测试调用HTTP get()方法,但更重要的是使用正确的参数测试它的。对于API,您的方法可能必须使用查询参数格式化URL,并且您需要测试它是否正确执行了此操作。断言看起来像(再次使用RSpec):

http_mock.should_receive(:get).with('http:/example.com/some_endpoint?some_param=x')

此测试实际上是上一次测试的先决条件,只是测试get()被调用不会证实太多。例如,它会告诉您是否格式化了URL。