如何在RSpec集成测试中POST嵌套属性?

时间:2012-01-10 18:43:18

标签: ruby-on-rails post rspec integration-testing nested-attributes

我正在编写RSpec集成测试,因为我将意大利面条代码转换为使用accepts_nested_attributes_for。我有一个这样的片段:

# file: spec/requests/wizard_spec.rb
describe 'POST /wizard with address' do
  before(:each) do
    @premise_attributes = {
      "address"=>"600 Mellow Ave, Mellow Park, CA 94025, USA", 
    }
  end
  it 'should succeed' do
    post :create, "wizard" => { "premise_attributes" => @premise_attributes }
    response.status.should be(200)
  end
end

当然,这失败了:

 Failure/Error: post :create, "wizard" => { "premise_attributes" => @premise_attributes }
 ArgumentError:
   bad argument(expected URI object or URI string)

是否有将嵌套属性哈希值转换为POST格式的方法?

(相关但不太重要:记录或定义了post方法在哪里?我想看看它真正接受的是什么参数。)

2 个答案:

答案 0 :(得分:1)

而是post :create尝试使用post "/wizard"或在describe WizardController do; end块内嵌套您的规范。通常,只有当您在给定控制器的描述块内时,才能使用method :action语法。

答案 1 :(得分:0)

我试图通过尝试测试put来解决我的问题时发现了这一点。我的post方法虽然有效,但如果您仍然需要,我可以帮助您。我认为您的问题是您尝试更新属性,就好像它是一个标量类型变量,但嵌套属性实际上就像一个数组。 Rails通常将它们命名为“0”,“1”等,但我不确定名称是什么,只要它们是唯一的。试一试:

@premise_attributes = {
  "0" => {"address"=>"600 Mellow Ave, Mellow Park, CA 94025, USA"}
}

(顺便说一句,我遇到的问题是我的update规范失败了,因为它说我的地址并不是唯一借用你的例子的。)