Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试:如何断言?断言返回的结果或对模拟调用了方法?_Unit Testing_Mocking_Nunit_Nsubstitute - Fatal编程技术网

Unit testing 单元测试:如何断言?断言返回的结果或对模拟调用了方法?

Unit testing 单元测试:如何断言?断言返回的结果或对模拟调用了方法?,unit-testing,mocking,nunit,nsubstitute,Unit Testing,Mocking,Nunit,Nsubstitute,我试图找出断言的最佳方式,我是否应该用我应该返回的内容创建一个对象,并检查它是否等于预期结果 或者我应该对模拟运行一个方法,以确保该方法被实际调用 我已经看到了这两种方式,我想知道是否有人对此有任何最佳实践 当然,编写一个单元测试来断言在mock上调用了一个方法会更快、更容易,但是更快、更容易并不总是最好的方法——尽管有时可能是这样 每个人都断言什么,方法已被调用或断言返回的结果 当然,在单元测试中执行多个断言并不是最佳实践,所以答案可能是实际断言结果,并且调用了该方法?因此,我将创建两个单元测

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

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

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

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

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

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


但是现在考虑一下,如果我得到一个结果,我想我可以假设我的mock方法被调用了,那么这可能太过分了。

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

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

然后测试您是否能够正确地解析该值,并根据响应返回一些正确的值

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


此测试实际上是上一个测试的先决条件,仅测试调用了
get()
,并不能确认多少。例如,它会告诉您是否错误地格式化了URL。

这些都不是相互排斥的问题。你可以做一个,另一个,或者两个都做。
http_mock.stub(:get).and_return('{result: 5}')
http_mock.should_receive(:get).with('http:/example.com/some_endpoint?some_param=x')