【问题标题】:Testing GET in a rails controller在 Rails 控制器中测试 GET
【发布时间】:2026-01-31 06:40:01
【问题描述】:

我有一种感觉,我只是在语法上做错了事,但用谷歌“GET”搜索起来非常困难,所以我希望这里的人可能知道这个问题的答案。

我正在尝试通过 RSpec 测试来测试 Rails 控制器。我正在关注我在这里找到的一个例子 - http://www.elevatedrails.com/articles/2007/09/10/testing-controllers-with-rspec/ 但我被困在我正在测试的方法的实际执行上。

我正在执行 GET 请求,而上面的帖子执行 POST。我传入了 2 个参数制造商和型号。

理想情况下,我的 URL 应该类似于 http://mysite.com/Products/index/Manufacturer/ModelName

我无法弄清楚其余部分的 get 请求调用的语法。现在我有

get :index, :manufacturer=>@manufacturer, :modelName=>@modelName

我回来了

'ProductController 中的 ArgumentError 找到有效的产品应该检索产品' 参数数量错误(0 代表 2)

有什么想法吗?

edit: 需要注意的是@manufacturer 和@modelName 是在 before(:each) 中定义的

【问题讨论】:

  • 语法没问题。别的东西是不靠谱的。发布更多细节!再发布几行错误回溯,发布整个失败的规范,发布控制器的相关部分,并发布相关路由。 :)
  • 另外请注意,您似乎违反了一些 Rails 约定,这可能会使您的生活变得更艰难而不是更轻松。 modelName 应该是 model_name 并且 ProductController 应该是 ProductsController 的复数形式。
  • 另外,您可能应该丢失 url 中的大写字母,以及为什么要嵌套产品索引的制造商列表。当然,这会更好地工作 /products/manufacturers,因为这将是多对多,您是否也排除了 /manufacturers/products?但如前所述,需要代码才能找到问题的根源。
  • 我在下面找到了错误的答案,但只是想回复 cmets。明智的约定,我对 Rails 有点陌生。我主要是 PHP/.NET 开发人员,所以只是想赶上。谢谢你指出我会改变的。关于嵌套,目标是最终找到具有两个参数的单个产品。网址将是 site.com/manufacturer/model_name。也许放入制造商控制器会更好,但产品似乎合乎逻辑,因为我试图找到一种产品而不是产品的制造商。不过我可能想错了。

标签: ruby-on-rails ruby rspec


【解决方案1】:

我怀疑这是我对 Rails 编程不熟悉。

我将控制器方法定义为

def index(manufacturer, modelName) 

当我真的需要使用参数哈希来访问属性时。然后我必须定义一个自定义路由,因为 id 是默认情况下预期传递给控制器​​方法的唯一参数。

一旦我这样做了,我将规范更改为阅读

get :index, {:manufacturer=>@manufacturer, :modelName=>@modelName}

它奏效了。

感谢大家的cmets。

【讨论】: