6

我对 Rails 相当陌生,并试图通过从一开始就实施测试以“正确”的方式做事。昨天我使用脚手架生成器创建了我的第一个模型/视图/控制器配置。虽然有人告诉我你真的不应该使用脚手架,但它对我了解 Rails 代码的结构很有用。

我注意到的一件事是自动生成的 RSpec 主要放在spec/controllers 文件夹中。然而,当我观看这一集 Railscasts时,我注意到他使用了

rails generate integration_test [test_name]

在spec/requests 文件夹中放置一个测试文件的命令。然而,他编写的所有测试都与控制器交互。我试图确定的是存储这些测试的最佳实践。

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

4

2 回答 2

6

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

这里有一些关于这两种测试的文章。

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

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

于 2012-08-03T18:18:51.507 回答
0

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

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

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

于 2012-08-03T23:26:55.580 回答