我试图按照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
所示的完全相同的用户,这正是我想要的。
答案 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]