1

Rails 3 で、特定のプロパティ値を持つ関連オブジェクトが少なくとも 1 つ存在するかどうかをチェックする検証クラスを作成しようとしています。

私のシナリオでは、アカウントは多くのユーザーを持つことができます。User モデルには「Role」文字列フィールドがあります。アカウントには、「admin」に相当するロールを持つユーザーが少なくとも 1 人必要です。

テスト中に次のコードが壊れています (rspec と Factory Girl を使用しています)。テストが実行されると、account_id は null として返されます。

モデルは次のとおりです。

class Account < ActiveRecord::Base
  validates :name, :presence => true, :uniqueness => true
  validate :has_one_admin
  has_many :users
  attr_accessible :name

  private 

  def has_one_admin
    User.where(:role => "admin", :account_id => self.id).count > 0
  end
end

rspecによってスローされるエラーは次のとおりです。

Error message being thrown:   Failure/Error: @account = Factory(:account_with_admin)
 ActiveRecord::StatementInvalid:
   SQLite3::SQLException: no such column: users.account_id: SELECT COUNT(*) FROM "users" WHERE "users"."role" = 'admin' AND "users"."account_id" IS NULL

RSpec テストは次のとおりです。

require 'spec_helper'

describe Team do

   # - Removed -  
   # before(:each) do
   #   @account = Factory(:account)
   #  @attr = { :name => "Testing Team"}
   # end

  # Modified after discussion...
  before(:each) do
    @user = Factory(:user)
    @act_attr = { :name => "My Account",
                  :users => @user }
    @account = Account.new(@act_attr)
    @attr = { :name => "Testing Team"}
  end
  # End of modification


  it "must have a name" do
    no_name_team = Team.new(@attr.merge(:name  => ""))
    no_name_team.should_not be_valid
  end ...

そして最後に、私の工場ファイル:

Factory.define :admin, :class => User do |f|
  f.email 'admin@admin.com'
  f.password  'password'
  f.role 'admin'
end

Factory.define :team, :class => Team do |f|
f.name 'Testing Team'   
end

Factory.define :account, :class => Account do |f|
    f.name 'Testing Account'
end

Factory.define :account_with_admin, :parent => :account do |f|
  f.after_create { |a| Factory(:admin, :account => a) }
end

私の仮定は、オブジェクトの永続化よりも先にジャンプしていると思いますが、どこにあるのかわかりません。ヘルプ/指示をありがとう!

4

0 に答える 0