我有一个帐户模型,其中包含一些基本帐户信息(帐户名称,网站等)。然后我有一个用户模型,在app / models / user.rb
中有以下内容belongs_to :account
我的routes.rb
中也有以下内容map.resources :account, :has_many => [:users, :othermodel]
我面临的问题是以下测试失败:
test "should create user" do
assert_difference('User.count') do
post :create, :user => { } #this is the line it's actually failing on
end
assert_redirected_to user_path(assigns(:user)) #it doesn't get here yet
end
它给出的错误是“找不到没有ID的帐户”所以我有点理解为什么它失败了,因为它没有帐户对象(或者说是account_id)知道什么帐户创建用户。我尝试过以下各种变体,但我完全迷失了:
post :create, :user => { accounts(:one) } #I have the 'fixtures :accounts' syntax at the top of the test class
post :create, [accounts(:one), :user] => { }
post :create, :user => { accounts(:one), #other params for :user }
和我说的一样,几乎我能想到的每一个变化。我找不到很多关于这样做的文档,这可能就是人们为了做测试数据而转移到Factories的原因,但是我希望在转向其他事情之前理解Rails中标准的东西。
任何人都可以帮我解决这个问题吗?
我设法让测试在不同的位置失败,我必须确保测试实际上可以进入创建操作(在我的应用程序中有一些authlogic的东西)
现在说
未定义的方法'用户'为nil:Class
所以现在它说它无法在控制器中的@account对象上找到用户集合,主要是因为它仍然无法找到@account,即使它实际上没有找到相关帐户。所以我的before_filter :find_account
工作到了不会破坏的程度,但它似乎找不到帐户。
我尝试了post :create, :id => @account.id, :user => { }
,但无济于事。还尝试了post :create, :account => accounts(:one), :user => { }
和:user => { :account => accounts(:one) }
,但结果相同。
答案 0 :(得分:0)
我认为你的协会倒退了。如果是这种情况,那么Account
模型应该belong_to :user
,那么User
模型应该has_one :account
。
否则,由于您正在创建属于某个帐户的用户,因此您应该在params中传递帐户:id
:
post :create, :id => some_test_account.id, :user => {...}
答案 1 :(得分:0)
belongs_to
关联的has_many
方的典型控制器会有这样的创建操作:
def create
@account = Account.find(params[:account_id])
@user = @account.users.build(params[:user])
if @account.save
# handle success
else
# handle failure
end
end
如果你的控制器看起来不像这样,你就不能正确处理参数,从而导致测试失败。
您还可以查看路线。你应该看到类似的东西:
POST /accounts/:account_id/users(.:format) {:controller=>"users", :action=>"create"}
这是Rails将params[:account_id]
设置为所请求帐户的值的另一个线索。