与factorygirl

时间:2015-08-04 22:29:43

标签: ruby-on-rails ruby rspec associations factory-bot

我有一个非常简单的项目。它有一个有3个苹果的篮子。

我制作了一个新项目并添加了一些宝石。 (包括RSpec和FactoryGirl)

我跑了

rails g scaffold basket
rails g scaffold apple basket:references
rake db:migrate

这是篮子模型

class Basket < ActiveRecord::Base
  has_many :apples
end

这是篮子工厂

FactoryGirl.define do
  factory :basket do
    transient do
      apples_count 3
    end
    after(:create) do |basket, evaluator|
      create_list(:apple, evaluator.apples_count, basket: basket)
    end
  end
end

这是苹果模型

class Apple < ActiveRecord::Base
  belongs_to :basket
end

这是苹果工厂

FactoryGirl.define do
  factory :apple do
    basket
  end
end

这是basket_spec.rb

require 'rails_helper'

RSpec.describe Basket, type: :model do
  it "has 3 apples" do
    basket = FactoryGirl.build(:basket)
    basket.apples.length.should == 3
  end
end

现在看来测试失败了,因为basket.apples.length返回0而不是3.为什么它不返回3,我怎样才能让这个测试通过?

2 个答案:

答案 0 :(得分:2)

其中一个问题是,您可以更加严谨地使用

 FactoryGirl.define do
   factory :basket do
      # basket attributes here
        factory :basket_w_apples do   
          transient do
            apples_count 3
          end
          after(:create) do |basket, evaluator|
            create_list(:apple, evaluator.apples_count, basket: basket)
          end
        end
   end
 end

然后你的测试将是

 require 'rails_helper'

 RSpec.describe Basket, type: :model do
   it "has 3 apples" do
     basket = FactoryGirl.create(:basket_w_apples)
     basket.apples.length.should == 3
   end
 end

当然,回调是after_create,所以你需要创建而不是构建

答案 1 :(得分:1)

只有在创建了购物篮时才会创建您的苹果#build没有创建记录(它类似于ActiveRecord&#39; s #new,它只是初始化而没有提交。)

RSpec.describe Basket, type: :model do
  it "has 3 apples" do
    basket = FactoryGirl.create(:basket)
    basket.apples.length.should == 3
  end
end

那个人应该通过。