2015-08-15 66 views
1

我们定义了以下模型为什么我的工厂不认可我的泳池协会?

class UserPool < ActiveRecord::Base 
    belongs_to :pool 
    belongs_to :user 
    validates :pool, presence: true 
    validates :user, presence: true 

    def self.created(date) 
     where("DATE(created_at) = ?", date) 
    end 
    end 

及以下Factroy

FactoryGirl.define do 
    factory :user_pool do 
     pool 
     user 

     factory :paid_user_pool do 
     money_on_pool 10 
     end 
    end 
    end 

当我运行下面的测试中,我recive错误

describe "obtain users_pools created at specifict time" do 
    before do 
     users = create_list :user, 3, active: false 
     user4 = create :user 

     @pool = create :pool 
     users.each do |user| 
     create :user_pool, user: user, pool: @pool, created_at: 1.days.ago 
     end 
     create :user_pool, user: user4, pool: @pool 
    end 

    it "should return just users_pools created at specifict time" do 
     users_pools = @pool.user_pools.created(1.days.ago) 
     users_pools.count.should eq 3 
    end 
    end 

错误:

ActiveRecord::RecordInvalid: 
    The validation failed: Pool can’t be blank 

为什么我的工厂不认可我的泳池协会?

+0

请看我的答案,并让我知道如果这可以解决您的问题。如果没有,请显示完整的错误日志。 –

+0

为了澄清,你确实有一个“Pool”类,对吧? – onebree

+0

你还有问题吗?你需要提供的其他细节? – onebree

回答

0

创建工厂时,可以列出具有预定义值的属性。否则,您可以从工厂中省略它们,并在测试中明确声明它(在创建过程中)。

# Example for :user 
factory :user do 
    sequence(:name) { |n| "Test User #{n}" } 
end 

现在,当你调用create(:user),默认名称将包括一个数字,以1为创建的每个用户增加。有关更多信息,请参阅#sequence"Sequences"

现在到你的具体例子。您可以通过以下两种方式之一创建user_pool工厂。

# No default attributes, requires explicit assignment 
factory :user_pool do 
end 
create(:user_pool, user: user, pool: @pool) 

# Default attributes can be overridden during test 
# Requires you to create :user and :pool factories 
factory :user_pool do 
    after(:build) do |user_pool| 
    user_pool.user = create(:user) 
    user_pool.pool = create(:pool) 
    end 
end 

当你的build是一个ActiveRecord对象时,它不会被提交给数据库。您可以忽略必要的属性。构建对象后,会创建两个(user,pool),并将其分配给正确的user_pool属性。请参阅文档"Callbacks"以获取更多信息。

如果您想在测试中创建@pool,仍然可以执行以下操作。它将覆盖默认的pooluser属性。

user_pool = create(:user_pool, user: user, pool: @pool) 
0

因为您的关联对象没有正确创建。所以,验证失败。

不要保存相关的对象,在工厂指定strategy: :build

factory :user_pool do 
    association :pool, factory: :pool, strategy: :build 
    association : user, factory: :user, strategy: :build 
end 

然后,使用build代替create

pool = build(:pool) 
. . . 
. . . 

this discussion会给你有关问题的更多见解。