0

我正在尝试找出断言的最佳方法,我是否应该创建一个包含我应该返回的对象并检查它是否等于预期结果?

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

我已经看到了这两种方式,我想知道是否有人对此有任何最佳实践。

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

每个人都断言,方法已被调用或断言返回的结果是什么?

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

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

4

1 回答 1

1

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

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

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

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

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

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

这个测试确实是之前测试的先决条件,简单地get()调用测试并不能确认太多。例如,它会告诉您是否错误地格式化了 URL。

于 2013-08-03T18:50:39.487 回答