我正在使用 Rails 5 和 minitest。我想知道如何测试控制器方法的实例变量中的字段值。我意识到如果我想测试变量是否已定义,我可以这样做
assert_not_nil assigns(:issue)
但我不太清楚是否想测试 @issue.stop_id 的值。我的控制器方法是
# GET /issues/new
def new
unless user_signed_in?
redirect_to new_user_session_path
end
@issue = Issue.new(stop_onestop_id: params[:stop_id], line_onestop_id: params[:line_id])
end
我正在我的测试方法中尝试这个
test "get index page" do
get index_url
assert_not_nil assigns(:issue)
assert_equal test_stop_id, @issue.stop.id
assert_equal test_line_id, @issue.line.id
assert_response :success
end
但我在线上遇到了 NoSuchMethodError
assert_equal test_stop_id, @issue.stop_id
在测试方法中
test "logged in should get issues page" do
sign_in users(:one)
test_stop_id = 1
test_line_id = 1
get new_issue_url, params: {stop_id: test_stop_id, line_id: test_line_id}
assert_equal test_stop_id, @issue.stop_id
assert_equal test_line_id, @issue.line_id
assert_response :success
end
这可能不是处理它的最佳方法,但我注意到使用
assigns(:instance_var_name)
将返回实例变量的值,因此您可以使用如下所示的方法来测试值:
issue_var = assigns(:issue)
assert_equal test_stop_id, issue_var.stop_id
我意识到这是一个老问题,但我今天偶然发现了它,并认为我应该添加一个答案。令人困惑的是
assigns(:issue)
返回控制器中定义的全局变量。然而,它并没有在测试套件中定义相同的全局变量。因此,在测试套件中,@issue 在调用 allocate 之前为零,并且在调用之后仍然为 nil。
无论如何,一旦您可以通过分配获取对象的关联和方法,就可以直接访问它:
assert_equal test_stop_id, assigns(:issue).stop_id