使用Minitest访问控制器实例变量

时间:2016-12-04 20:36:38

标签: ruby tdd ruby-on-rails-5 railstutorial.org minitest

我尝试使用minitest访问控制器内的实例变量。

例如:

microposts_controller.rb:

def destroy
  p "*"*40
  p @cats = 42
end

如何使用minitest在@cats内测试microposts_controller_test.rb的值?

我知道我可以从浏览器提交delete请求并检查我的服务器日志并找到:

"****************************************"
42

我在another answer中读到我可以访问包含所有实例变量的assigns哈希,但它没有用。我也试过查看controller对象。如下所示:

microposts_controller.rb:

test "@cats should exist in destroy method" do 
  delete micropost_path(@micropost)
  p controller.instance_variables
  p assigns[:cats]
end

输出:

[:@_action_has_layout, :@_routes, :@_request, :@_response, :@_lookup_context, :@_action_name, :@_response_body, :@marked_for_same_origin_verification, :@_config, :@_url_options]0:04
nil

我希望在@cats对象中看到controller实例变量。我也期待看到42输出。

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

您可以使用view_assigns

# asserts that the controller has set @cats to true
  assert_equal @controller.view_assigns['cats'], true

答案 1 :(得分:0)

我有before_action检查以确保用户已登录,因此delete请求被重定向。

我还有一个测试助手,它会将有效的用户ID放入会话中。使用它一切都按预期工作:)

microposts_controller_test.rb:

test "@cats should exist?" do
  log_in_as(users(:michael))
  delete micropost_path(@micropost)
  p controller.instance_variables
  p assigns[:cats]
end

test_helper.rb中:

def log_in_as(user)
  session[:user_id] = user.id
end

输出:

[:@_action_has_layout, :@_routes, :@_request, :@_response, :@_lookup_context, :@_action_name, :@_response_body, :@marked_for_same_origin_verification, :@_config, :@current_user, :@_params, :@micropost, :@cats, :@_url_options]
42