RSpec params都是字符串,破坏测试

时间:2014-02-21 12:11:45

标签: rspec ruby-on-rails-4

我正在编写一些控制器/请求规范,目前正在处理更新请求。相当直接,在许多其他情况下,这是完美的,但我似乎遇到了障碍。

在我的routes.rb文件中,我限制了控制器的操作,因此

resources :model, except: [:destroy, :edit, :new]

为了避免在用户请求show时调用/new操作的问题,我添加了约束,因此路径现在看起来像

resources :model, except: [:destroy, :edit, :new], constraints: { id: /\d/ }

这很好用,请求/new导致404,但是我现在遇到了我的请求测试问题,因为RSpec似乎使所有参数都成为字符串。

在我的测试中,我正在做

resource = FactoryGirl.create(:model)
params = { id: resource.id, resource: { edited: true }}
put :update, params

但是这会导致错误

No route matches {:id=>"10", :resource=>{:edited=>true}, :controller=>"models", :action=>"update"}

如果这个错误是正确的,那么似乎尽管我将id param设置为存储在资源中的整数ID(即使我明确地将.to_i放在它上面),param也会作为字符串发送,并且因为我的约束而没有匹配路线。

有没有办法阻止这种行为?我的路由测试正在按预期工作,所以我很困惑为什么这会失败。

更新

有趣的是,如果我将测试从控制器规范转移到请求规范,这将不再失败并且正常工作。我很高兴为他们制作所有请求规格,但我仍然很好奇为什么会发生这种情况,或者我是否偶然发现了rSpec中的错误?

1 个答案:

答案 0 :(得分:0)

你的正则表达式指定了一个数字id,但你输入的是两位数的id。也许修复就像将正则表达式更改为/\d+/一样简单。