使用Rspec进行控制器测试中的Rails关联问题

时间:2014-12-16 03:18:27

标签: ruby-on-rails ruby ruby-on-rails-4 rspec

我在尝试在测试期间以一对多关系访问我的关联模型时遇到问题。我不明白为什么以下不返回该关联。

我关心这个问题的原因是因为我想通过my_factory_girl_user.guardians.first使用Factory Girl给我的监护人打电话。我试图通过仅使用ActiveRecord进行简化,但它仍然没有表现出我的预期。

我是一个真正的Rails初学者,所以对此问题的任何建议或如何更好地调试它将非常感激!

问题:@ target_user.guardians为什么不返回任何内容?

用户模型

class User < ActiveRecord::Base
  has_many :guardians, dependent: :destroy
  ...
end

守护者模型

class Guardian < ActiveRecord::Base
  belongs_to :user
  ...
end

控制器规格

describe 'PUT #update' do
context 'when logged in and authorized' do
  let(:new_attributes){
    {level: 31}
  }
  it 'sets current guardian' do
    @target_user = User.create!(profile_name: 'MyGuardian', system: 'Xbox One', region: 'North America', password: "password", password_confirmation: "password")
    @target_guardian = Guardian.create!(level: 31, guardian_class: 'Titan', activity: 'Vault of Glass', user_id: @target_user.id)
    puts "User: #{@target_user.inspect}"
    puts "Guardian: #{@target_guardian.inspect}"
    puts "user.guardians: #{@target_user.guardians}"
    put :update, {id: @target_guardian.id, guardian: new_attributes}, {user_id: @target_user.id}
    expect(assigns(:guardian)).to eq(@target_guardian)
  end
end

输出

User: #<User id: 3147, email: nil, password_digest: "$2a$04$QPk3kCsKLp0IX.YmMPAPdO2gCe79mwVybHkFpcEsVkG...", created_at: "2014-12-16 02:55:57", updated_at: "2014-12-16 02:55:57", is_admin: nil, profile_name: "MyGuardian", system: "Xbox One", region: "North America">
Guaridan: #<Guardian id: 3284, created_at: "2014-12-16 02:55:57", updated_at: "2014-12-16 02:55:57", user_id: 3147, fireteam_id: nil, level: 31, guardian_class: "Titan", activity: "Vault of Glass", comment: nil>
user.guardians: 

答案:

感谢Typpex的帮助!我的问题是在创建Guardian之后我没有刷新用户,我使用的解决方案是在创建Guardian之后添加以下行。有关更多信息,请阅读以下答案。

@target_user.reload

1 个答案:

答案 0 :(得分:-1)

这是因为你从未真正将监护人添加到用户的监护人名单中,例如:

@target_user.guardians << @target_guardian

只有在那之后你才能在@ target_user.guardians中看到监护人。

使用rspec进行测试时,您需要在控制器中调用该操作,该操作实际上是将监护人添加到用户的监护人集合中,然后测试监护人是否正确添加了类似

的内容
@target_user.guardians.size.should_be 1