Ruby on rails 与编写模拟用于测试相比,使用FakeWeb的缺点

Ruby on rails 与编写模拟用于测试相比,使用FakeWeb的缺点,ruby-on-rails,unit-testing,mocking,fakeweb,Ruby On Rails,Unit Testing,Mocking,Fakeweb,我从来都不喜欢写模仿,不久前这里有人建议使用FakeWeb。我立刻完全爱上了假冒网站。然而,我不得不怀疑使用FakeWeb是否有负面影响。看起来模仿仍然很常见,所以我想知道我遗漏了什么,用FakeWeb来代替是错误的。是否存在Fakeweb无法涵盖的某种错误,或者是TDD或BDD流程的问题?您应该看看WebMock 模拟http请求的缺点是缺乏针对远程API更改的保护。如果远程HTTP服务发生变化,并且您的代码不再兼容,您的测试将不会告诉您这一点。如果您自己模拟http客户机方法,您也会遇到同样

我从来都不喜欢写模仿,不久前这里有人建议使用FakeWeb。我立刻完全爱上了假冒网站。然而,我不得不怀疑使用FakeWeb是否有负面影响。看起来模仿仍然很常见,所以我想知道我遗漏了什么,用FakeWeb来代替是错误的。是否存在Fakeweb无法涵盖的某种错误,或者是TDD或BDD流程的问题?

您应该看看WebMock

模拟http请求的缺点是缺乏针对远程API更改的保护。如果远程HTTP服务发生变化,并且您的代码不再兼容,您的测试将不会告诉您这一点。如果您自己模拟http客户机方法,您也会遇到同样的问题。 最好有一些集成测试套件来验证您的代码是否仍然可以与真正的http服务通信

像FakeWeb或WebMock这样的库的优点是,您可以专注于实现行为,而不必担心特定http客户端库的实现细节。即使您将库从例如Net::HTTP更改为RestClient,行为仍应保留,因此测试仍应通过。若您自己模拟http客户机,那个么在更改实现时必须更改测试,即使行为并没有更改。
使用FakeWeb或Webmock也有助于TDD或BDD(先测试)。在担心特定http客户端的实现细节之前,您可以通过规范或测试指定http行为。

您可能会对VCR感到满意,VCR是http模拟库的包装器。它缓存原始HTTP请求,以便您的测试快速且脱机工作,但也可以更改为再次执行原始请求,以查看测试是否针对远程API工作