`Assigns`在我的集成测试中没有工作

时间:2015-05-31 18:40:28

标签: ruby-on-rails ruby ruby-on-rails-4 integration-testing

我试图按照https://stackoverflow.com/a/17002140/4499505上的建议编写测试。

我的简化测试:

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

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

2 个答案:

答案 0 :(得分:1)

嗯,你的正确代码是:

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"]相同。

答案 1 :(得分:0)

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

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