在Rails测试中如何指定POST参数?

23

使用Test::Unit和Shoulda。尝试测试Users.create。我理解Rails表单发送对象的参数应该像这样:

user[email]

它在你的操作中转化为哈希值,对吧?

params[:user][:email]

好的,在我的测试中我已经尝试过...

setup { post :create, :post => { 'user[email]' => 'invalid@abc' } }

并且

setup { post :create, :post => { :user => { :email => 'abc@abcd' } } }

在这两种情况下,我的操作中 params[:user] 都是 nil。

2个回答

45
post :create, :user => { :email => 'foo@bar.com' }

get、post、put和delete方法的测试方法的通用格式如下:

def post(action_name, params_hash = {}, session_hash = {})

在测试中,params散列直接发送到您的控制器操作的params中,而没有任何形式的转换。即使进行集成测试,您也不需要测试此字符串到params的转换,因为Rails框架测试已经很好地覆盖了此功能。此外,需要params的所有测试方法都可以接受这种方式的散列,而不会发生错误,这使得事情变得容易。


这也会起作用: "post :create, { :email => 'foo@bar.com' }",从控制器方面来看,您将获得:params[:email]会给您提供'foo@bar.com'。 - nisevi

8
post :create, {:post => {}, :user => {:email => 'abc@abcd'} }

在这种情况下,params[:post]是空的, params[:user]是{:email => 'abc@abcd'}, params[:user][:email]是'abc@abcd'。
post :create, {:post => {:user => {:email => 'abc@abcd'} } }

在这种情况下,params[:post][:user][:email] 的值是 'abc@abcd'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接