【问题标题】:rspec-rails controller testing with assertions and assignsrspec-rails 控制器测试与断言和分配
【发布时间】:2017-02-02 11:51:09
【问题描述】:

我一直在使用 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

运行测试用例后,我意识到由于某些安全原因,不再支持 assert_template。

无方法错误: 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 自版本以来自动与此 gem 集成 3.5.0。将 gem 添加到您的 Gemfile 中就足够了。

但即使添加后,仍然会抛出同样的错误。

如何解决这个问题?有没有其他方法可以进行控制器测试。 很长一段时间以来,我一直在努力解决这个问题。任何帮助,将不胜感激。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    Rails: Support for Rails 5 下的release notes 中,您可以找到测试控制器的推荐方法是Request specs

    对于新的 Rails 应用:我们不建议添加 rails-controller-testing gem 到您的应用程序。官方 Rails 团队和 RSpec 核心团队的建议是写 请求规格。请求规范允许您专注于单个 控制器动作,但不像控制器测试涉及路由器, 中间件堆栈,以及机架请求和响应。这增加了 现实主义到你正在编写的测试,并有助于避免许多 控制器规格中常见的问题。在 Rails 5 中,请求规范 比请求或控制器规范快得多 在 Rails 4 中,感谢 Rails 的 Eileen Uchitelle1 的工作 提交者团队。

    请求测试也命中视图。因此,您无需使用assert_template 进行测试。

    【讨论】:

    • 感谢@Narasima Reddy。那是一个快速的答复。我最终使用了请求规范,并且效果很好
    • 编写请求规范的说明中的示例包括:expect(response).to render_template(:new)render_template 委托给 assert_template,因此您最终会收到一条消息,建议您将 rails-controller-testing 添加到您的 Gemfile。请求规范不应该测试模板的呈现吗?
    【解决方案2】:

    当有人在谷歌搜索 NoMethodError: assert_template has been extracted to a gem. 时首先出现这个问题,这是当您尝试使用render_template 或assigns 编写控制器规范或请求规范时出现的错误消息。

    RSpec documentation 仍然使用它作为如何处理控制器和请求规范的示例。 Narashima Reddy 在别处列出了为什么使用请求规范而不是控制器规范的基本原理。但我仍然对如何处理控制器或请求规范感到困惑。

    答案似乎是否定的。 assigns 和 assert_template have been deprecated,这意味着使用它们是代码异味。

    不要编写一个测试来检查模板是否正在呈现,而是编写一个测试来检查该模板将显示什么,或者响应是否成功。与其编写检查是否分配了值的测试,不如检查数据库是否已更改,或者是否分配了 cookie 或会话,或者是否显示了值。

    这对我来说是一个很难掌握的概念,就像许多在线教程甚至official rspec docs make reference to this 一样,但简短的回答似乎是,不要这样做。我希望这可以帮助其他人搜索 assert_template 错误消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多