我的控制器看起来像这样:
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)
答案 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:
答案 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