`Assigns` 在我的集成测试中不起作用

`Assigns` isn't working in my integration test

我正尝试按照 上的建议编写测试。

我的简化测试:

test "test" do
  log_in_as(@user)
  get users_path
  assert_template 'users/index'
  assigns[:users].each do 
    assert_select 'a[href=?]', users_path(user)
  end
end

错误结果:

NoMethodError: undefined method `each' for nil:NilClass

控制器方法:

  def index
    @users_grid = initialize_grid(User.where(verified: true),
      per_page:        15,
      order:           'users.username',
      order_direction: 'desc')
  end

显然 assigns[:users] 是空的,即使在 fixtures 文件中有用户。我究竟做错了什么?我知道 assigns[:users] 应该分配与 users/index 上显示的完全相同的用户,这正是我想要的。

嗯,您的正确代码是:

test "test" do
  log_in_as(@user)
  get users_path
  assert_template 'users/index'
  # in your controller you have the instance var as 
  # @users_gird, not @users.
  assigns[:users_grid].each do 
    assert_select 'a[href=?]', users_path(@user)
  end
end

assigns is a hash,可在 Rails 测试中访问,包含此时可用于视图的所有 实例变量。它也是一个访问器,允许您使用符号查找属性(因为从历史上看,分配哈希的键都是字符串)。换句话说,assigns(:contact)assigns["contact"] 相同。

请注意,在您链接到的答案中,assigns[] 中的符号与控制器操作中实例变量的符号相匹配。

在您的情况下,您正在分配实例变量 @users_grid 但试图遍历 assigns[:users]。您可能只想将后者更改为 assigns[:users_grid]