使用rails编写RSpec测试时,spec / requests文件夹和spec / controllers应该包含哪些内容?

时间:2012-08-03 18:11:33

标签: ruby-on-rails ruby ruby-on-rails-3 rspec2 rspec-rails

我对铁路相当陌生并试图做正确的事情"对"从get go实施测试的方法。昨天我使用脚手架生成器创建了我的第一个模型/视图/控制器配置。虽然我被告知你真的不应该使用脚手架,但是我可以学习如何构建Rails代码。

我注意到的一件事是自动生成的RSpec主要放在 spec / controllers文件夹 中。但是当我看到this episode of Railscasts时,我注意到他使用了

rails generate integration_test [test_name]

命令将单个测试文件放在 规范/请求文件夹 中。然而,他所写的所有测试都与控制器进行了交互。我试图确定的是存储这些测试的最佳实践。

什么时候应该在spec / requests文件夹中存储测试?何时应该在spec / controllers文件夹中存储测试?任何反馈将不胜感激!

2 个答案:

答案 0 :(得分:6)

实际上这些是两种类型的测试。在控制器文件夹中,您应该创建测试以测试控制器操作,在请求文件夹中,您应该放置测试以与视图交互,这将实际测试您的所有应用程序部分,这就是它命名为集成测试的原因。

以下是一些关于这两种测试的文章。

http://everydayrails.com/2012/04/07/testing-series-rspec-controllers.html

http://everydayrails.com/2012/04/24/testing-series-rspec-requests.html

答案 1 :(得分:0)

控制器规范测试单个控制器操作的调用。通常你不会渲染视图(虽然你可以打开它),但是很多模型代码也很常见。您与被测代码的唯一交互是调用单个控制器操作。您可以将这些视为控制器的单元测试。

另一方面,请求规范测试整个堆栈(路由,控制器,视图,模型等)。您可以执行更接近用户操作的操作,而不是仅调用单个控制器操作:访问页面,填写表单,单击按钮。通常这将跨越多个动作/控制器。例如,您可以编写一个请求规范,该规范将用户完成将产品添加到购物车,然后完成签出所涉及的各个步骤的过程。

您通常使用capybara(我认为您仍然可以使用webrat)与您生成的页面进行交互。使用合适的capybara驱动程序,页面上的javascript也将被执行,例如,您可以测试您的客户端javascript使用您的控制器生成的json做正确的事情(尽管您可能需要考虑编写javascript规范,如果您有很多)