【问题标题】:`Assigns` isn't working in my integration test`Assigns` 在我的集成测试中不起作用
【发布时间】:2015-05-31 18:40:27
【问题描述】:

我正在尝试按照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

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

【问题讨论】:

  • 显示你的控制器动作......
  • 添加到原帖
  • 你需要做assigns[:users_grid]
  • 谢谢,这似乎取得了进展,但现在它给出了与下一行(assert_select 行)相关的错误:NameError: undefined local variable or method 'user'

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


【解决方案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 哈希的键都是字符串)。换言之,assigns(:contact)assigns["contact"] 相同。

【讨论】:

  • 谢谢,这产生了错误ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"users", :id=>nil} missing required keys: [:id]。在开发中,页面可以正常工作。
  • 恐怕它有同样的错误信息。 users_path 是一个不应采用 id/参数的索引...错误消息是指 show 方法,所以看起来...相关路线是:users GET /users(.:format) users#index
  • @Nick 抛出错误的行号是多少?
  • assert_select 行。
  • 啊,上次我从您的示例中错误地复制了它。我现在让它工作了。毕竟它必须是userS_path(@user)。谢谢!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-15
    • 2019-08-10
    • 1970-01-01
    • 2021-11-03
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多