Sug*_*nya 4 rspec ruby-on-rails rspec-rails
我一直在使用 rails 5.0.0.1,我是自动化测试的新手,并且使用 rspec-rails-3.5.2 来编写自动化。
我想测试一些基本的控制器渲染功能和实例变量分配。编写了一个控制器测试用例,它将检查是否呈现了 get_structure 模板并分配了所需的实例变量。
describe 'GET #get_structure' do
context 'get attributes to build tree structure' do
let(:plan) { FactoryGirl.create(:plan) }
it 'expects all keys to build structure' do
get :get_structure, params: { id: 6, school_subdomain: 'chrys' }
expect(response).to render_template(:get_structure)
expect(assigns.keys.include?('collection')).to be true
expect(assigns.keys.include?('structure')).to be true
expect(assigns.keys.include?('config')).to be true
end
end
end
Run Code Online (Sandbox Code Playgroud)
一旦我运行了测试用例,我意识到由于某些安全原因,assert_template 不再受支持。
NoMethodError: assert_template 已被提取到 gem 中。要继续使用它,请添加
gem 'rails-controller-testing'到您的 Gemfile。
由于它在 rspec-rails 文档中提到使用 rails-controller-testing gem 将添加回功能,我确实添加了它。
在 Rails 5.x 中,控制器测试已移至其自己的 gem 中,即 rails-controller-testing。在您的控制器规范中使用分配而不添加此 gem 将不再有效。
我添加了 rails-controller-testing-1.0.1 gem。同样在 rails-controller-testing gem 文档中提到
rspec-rails 自 3.5.0 版起自动与此 gem 集成。将 gem 添加到您的 Gemfile 中就足够了。
但即使添加后,它仍然抛出相同的错误。
如何解决这个问题?有没有其他方法可以进行控制器测试。一段时间以来,我一直在为此烦恼。任何帮助,将不胜感激。提前致谢。
smi*_*rog 12
当您在 google 上搜索当 NoMethodError: assert_template has been extracted to a gem.您尝试使用 render_template 或 allocate 编写控制器规格或请求规格时出现的错误消息时,首先会出现这个问题。
RSpec 文档仍然使用它作为如何处理控制器和请求规范的示例。Narashima Reddy在其他地方列出了为什么使用请求规范而不是控制器规范的理由。但我仍然困惑如何处理控制器或请求规范。
答案似乎是否定的。分配和断言模板都已被弃用,这意味着使用它们会产生代码味道。
不要编写测试来检查模板是否正在呈现,而是编写一个测试来检查该模板将显示的内容,或者响应是否成功。不要编写检查是否正在分配值的测试,而是检查数据库是否已更改、是否分配了 cookie 或会话、或者是否显示了值。
这对我来说是一个很难理解的概念,因为许多在线教程甚至官方 rspec 文档都提到了这一点,但简短的答案似乎是,不要这样做。我希望这可以帮助其他人搜索 assert_template 错误消息。
从Rails: Support for Rails 5下的 发行说明中,您可以找到测试控制器的推荐方法是Request specs。
对于新的 Rails 应用程序:我们不建议将 rails-controller-testing gem 添加到您的应用程序中。Rails 团队和 RSpec 核心团队的官方建议是改为编写 请求规范。请求规范允许您专注于单个控制器操作,但与控制器测试不同的是,测试涉及路由器、中间件堆栈以及机架请求和响应。这增加了您正在编写的测试的真实性,并有助于避免控制器规范中常见的许多问题。在 Rails 5 中,请求规范比 Rails 4 中的请求规范或控制器规范要快得多,这要归功于 Rails 提交团队的 Eileen Uchitelle1 所做的工作。
请求测试也会命中视图。因此,您无需使用assert_template.
| 归档时间: |
|
| 查看次数: |
2441 次 |
| 最近记录: |