【问题标题】:Type Error in RSpec controller specRSpec 控制器规范中的类型错误
【发布时间】:2012-09-20 23:42:36
【问题描述】:

我在进行 RSPec 测试时遇到问题。测试对请求中的一些对象执行 PUT。接收 PUT 的控制器似乎没有得到正确的值

例如,'put :update, :id => @channel.id, :channel => @channel, :tags => @tag' 然后,在控制器中,当我尝试使用 params[:tags]该位置有一个整数。规范和控制器方法的要点在https://gist.github.com/3715021

当我从 Rails 3.0.13 升级到 3.1.8 时,这开始发生

知道这里可能会发生什么以及如何解决吗?

【问题讨论】:

  • 没有params[:tag]被传入,只有params[:tags]。你是这个意思吗?
  • 对不起。我输入了问题; Gist 的实际代码包括:tags。我编辑了问题

标签: ruby-on-rails rspec2 rspec-rails


【解决方案1】:

我假设@tag 是您的标签模型中的一个对象。当你给 Rails 一个像

这样的对象时
`get :action, :foo => foo`

或在 url 助手中(例如,foo_path(foo)),

Rails 将通过#to_param 方法将您的对象转换为适合在url 中使用的参数。你可能得到一个整数,因为Tag#to_param 返回你的数据库中标签的 id。

相比之下,您的更新操作似乎期望 params[:tags] 是一个哈希值,大概是从包含 tags[:name] 等值的字段的表单生成的。

如果不了解相关代码的更多信息,我将无能为力。但我猜你想要做的是改变你的测试阅读

put :update, :id => @channel.id, :channel => @channel, :tags => { :name => 'tag' }

或类似的东西,模仿您通过实际提交 PUT 到您的更新操作的表单获得的参数。

【讨论】:

  • 那行得通。虽然我对为什么使用 Rails 3.0.13 感到困惑,但我可以传递对象并升级到 3.1.8 导致我必须指定一个哈希值。感谢@gregates 的帮助
  • 是的,我也是。我在工作中使用 3.0.11,我很确定传递对象在那个版本中不起作用。您确定没有其他变化可以解释为什么您在这次测试中从绿色变为红色?
  • 是的。我正在关注 Railscast 升级 Rails。我运行了自动测试,将 gemfile 更改为使用 Rails 3.1.8 并再次启动自动测试。
【解决方案2】:

这很难为您提供帮助,因为我们不知道您要做什么。例如,如果您显示更多的测试(例如,您设置为变量的值)和测试的具体结果,将会很有帮助。

无论如何,@tags 变量是一个 arel 对象吗?如果是这样,您是否希望将 ID 作为要传递的值?如果没有,那么您可能想要指定@tags 中引用的属性。例如,@tags.name... 或者,@tags 本身是否引用哈希?

【讨论】:

  • 标签是一个对象。从表单提交时,它只是通过表单助手提交的内容。但是,在我编写的 rspec 中,传递对象就足够了,直到我升级到 Rails 3.1
猜你喜欢
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多