带有断言和分配的 rspec-rails 控制器测试

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 错误消息。


Nar*_*ker 7

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

对于新的 Rails 应用程序:我们不建议将 rails-controller-testing gem 添加到您的应用程序中。Rails 团队和 RSpec 核心团队的官方建议是改为编写 请求规范。请求规范允许您专注于单个控制器操作,但与控制器测试不同的是,测试涉及路由器、中间件堆栈以及机架请求和响应。这增加了您正在编写的测试的真实性,并有助于避免控制器规范中常见的许多问题。在 Rails 5 中,请求规范比 Rails 4 中的请求规范或控制器规范要快得多,这要归功于 Rails 提交团队的 Eileen Uchitelle1 所做的工作。

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

  • 编写请求规范的说明中的示例包括以下内容:`expect(response).to render_template(:new)`。`render_template` 委托给 `assert_template`,因此您最终会收到一条消息,建议将 rails-controller-testing 添加到您的 Gemfile 中。是否应该请求规范而不是测试模板的渲染? (6认同)