ruby-on-rails - 使用 Rspec 进行 Controller 测试中的 Rails 协会问题

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

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

我关心这个问题的原因是因为我想使用 Factory Girl 通过 my_factory_girl_user.guardians.first 来调用我的监护人,但这是行不通的。我试图通过仅使用 ActiveRecord 来简化,但它仍然没有达到我的预期。

我是一个真正的 Rails 初学者,所以任何关于这个问题或如何更好地调试它的建议都将不胜感激!

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

用户模型

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

监护人模型

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

Controller 规范

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 的帮助!我的问题是我在创建守护者后没有刷新用户,我使用的解决方案是在创建我的守护者后添加以下行。有关更多信息,请阅读下面的答案。

@target_user.reload

最佳答案

这是因为您实际上从未将监护人添加到用户的监护人列表中,例如:

@target_user.guardians << @target_guardian

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

当使用 rspec 进行测试时,您需要调用 Controller 中的操作,该操作实际上将监护人添加到用户的监护人集合中,然后测试监护人是否已正确添加,例如

@target_user.guardians.size.should_be 1

关于ruby-on-rails - 使用 Rspec 进行 Controller 测试中的 Rails 协会问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27496977/

相关文章:

ruby-on-rails - 如何不在 ruby​​ on rails 4 上显示重复项?

javascript - TagName 输入未显示在我的 ember View 中

ruby-on-rails - 如何在Rails中编写条件迁移?

ruby-on-rails - 如何在lucern solr中搜索所有/通配符

ruby-on-rails - Rails-Devise在注册/创建后发送用户电子邮件

jquery - 在 ruby​​ on Rails 中使用 jQuery 验证提交按钮不起作用

mysql - 帮助设置 Ruby on Rails 和 MySQL - 提供奖励

ruby-on-rails - 批量插入 rails 3

ruby-on-rails - ActiveModel::MissingAttributeError 在部署后发生,然后在一段时间后消失

ruby - 如何编写能够匹配一两行文本的正则表达式