Rails,minitest:如何测试控制器的输出

时间:2016-11-22 13:44:15

标签: ruby-on-rails minitest

我的控制器看起来像这样:

class CalculatorController < ApplicationController

  def calculate
    money = params[:money].to_f
   @worktime =  divide(money, 25)
  end

  private

  def divide(money, worktime)
    output = money/worktime
  end
end

我写了一个像这样的测试:

require 'test_helper'

class CalculatorControllerTest < ActionDispatch::IntegrationTest
  test "response" do
    get calculate_path
    assert_equal 200, response.status
  end
end

此测试通过。现在,我想写一个测试,检查输出是否正确。我试过这个:

require 'test_helper'

class CalculatorControllerTest < ActionDispatch::IntegrationTest
  test "response" do
    get calculate_path(money: 25)
    assert_equal 200, response.status
    assert_equal 1, @response.worktime
  end
end

但是会发生以下错误:NoMethodError: undefined method工作时间&#39;`

如何测试控制器的输出? (在我的情况下是@worktime)

2 个答案:

答案 0 :(得分:3)

这里有一篇关于Rails 5中测试更改的好文章: http://blog.bigbinary.com/2016/04/19/changes-to-test-controllers-in-rails-5.html

在Rails 4中,你会使用&#34;分配&#34;检查:

assert_equal 1, assigns(:worktime)

您仍然可以通过在测试组的Gemfile中包含rails-controller-testing gem https://github.com/rails/rails-controller-testing来实现此功能。更多来自dhh:

https://github.com/rails/rails/issues/18950

答案 1 :(得分:1)

Ruby Shell是实例变量。不是全局的。实例变量始终是私有的*。

因此@variables是属于@worktime的实例变量 - 而不是CalculatorController

Ruby允许您在不声明的情况下访问实例变量。

所以这个例子:

CalculatorControllerTest

实际上是在实践中:

require 'test_helper'

class CalculatorControllerTest < ActionDispatch::IntegrationTest
  test "response" do
    get calculate_path(money: 25)
    assert_equal 200, response.status
    assert_equal 1, @response.worktime
  end
end

以前你可以使用require 'test_helper' class CalculatorControllerTest < ActionDispatch::IntegrationTest test "response" do get calculate_path(money: 25) assert_equal 200, response.status assert_equal 1, nil.worktime # since @worktime is not declared in this scope. end end 来撬动控制器的内部工作,这在Rails 5中被移除了。你可以恢复它with a gem但是对于新的应用程序,你应该使用不同的方法进行测试 - 你应该通过根据响应代码和JSON或HTML输出测试实际输出来测试您的控制器。不是它如何发挥作用。

assigns