Rails功能测试由于关联而失败

时间:2010-05-24 04:05:29

标签: ruby-on-rails testing

我有一个帐户模型,其中包含一些基本帐户信息(帐户名称,网站等)。然后我有一个用户模型,在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中标准的东西。

任何人都可以帮我解决这个问题吗?

UPDATE:

我设法让测试在不同的位置失败,我必须确保测试实际上可以进入创建操作(在我的应用程序中有一些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) },但结果相同。

2 个答案:

答案 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]设置为所请求帐户的值的另一个线索。