如何测试依赖于另一个模型的模型?

时间:2012-04-30 22:04:15

标签: ruby-on-rails ruby testing rspec associations

我有UserAccountRole型号。用户可以自己存在。帐户必须通过角色与用户绑定。帐户必须至少有一个“所有者”类型的角色记录。我不知道如何在RSpec和FactoryGirl中测试它。

# user_id, account_id, role
Role < ActiveRecord::Base
  belongs_to :user
  belongs_to :account
end

User < ActiveRecord::Base
  has_many :roles
  has_many :accounts, through: roles
  accepts_nested_properties_for :accounts
end

Account < ActiveRecord::Base
  has_many :roles
  has_many :users, through: roles
end

如果用户未登录,则Accounts.new将显示“用户”和“帐户”表单。如果用户已登录,则仅显示“帐户”表单。麻烦的是,我不确定在尝试测试关联时,RSpec中的角色和帐户会是什么样子。

此测试失败(数组返回空):

describe Account do
  let(:user) { FactoryGirl.create(:user) }
  before { @account = user.accounts.build(title: "ACME Corporation", subdomain: "acme") }
  subject { @account }
  it { should respond_to(:users) }
  its(:users) { should include(user) }

然后,当用户登录时,以及当用户不登录时,会增加测试的复杂性。对于类似的用例,我可以看到任何参考样本代码?我也不确定要在roles_spec中测试什么,以及什么属于accounts_spec / user_spec。

工厂:

FactoryGirl.define do
  factory :user do
    name                  "Mickey Mouse"
    email                 "mickey@disney.com"
    password              "m1ckey"
    password_confirmation "m1ckey"
  end
  factory :account do
    title     "ACME Corporation"
    subdomain "acme"
  end
  factory :role do
    user
    account
  end
end

1 个答案:

答案 0 :(得分:1)

通过使用模拟框架来"mock"其他对象来测试依赖于其他对象的对象。有许多mock frameworks允许您这样做。