使用断言和分配进行rspec-rails控制器测试

时间:2017-02-02 11:51:10

标签: ruby-on-rails rspec 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

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

  

NoMethodError:   assert_template已被提取到gem。要继续使用它,   将gem 'rails-controller-testing'添加到您的Gemfile中。

由于在rspec-rails文档中提到使用rails-controller-testing gem会添加功能,我确实添加了它。

  

在Rails 5.x中,控制器测试已经移到了自己的gem中   是rails-controller-testing。使用分配控制器规格   没有添加这个宝石将不再有效。

我添加了rails-controller-testing-1.0.1 gem。另外在rails-controller-testing gem文档中提到了

  自版本以来,rspec-rails自动与此gem集成   3.5.0。将gem添加到Gemfile就足够了。

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

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

2 个答案:

答案 0 :(得分:4)

Rails:支持Rails 5 下的release notes,您可以找到测试控制器的推荐方法请求规范

  

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

请求测试也会查看视图。因此,您无需使用assert_template进行测试。

答案 1 :(得分:3)

这个问题首先出现在 Google 搜索 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 错误消息。