has_many 与工厂女郎的关联测试
has_many association testing with factorygirl
我有一个非常简单的项目。它有一个篮子,里面有 3 个苹果。
我创建了一个新项目并添加了一些 gem。 (包括 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 returns 0 而不是 3。为什么不返回 3,我怎样才能使这个测试通过?
只有在 创建 篮子时才会创建您的苹果。 #build
不创建记录(它类似于 ActiveRecord 的 #new
,它只是初始化而不提交)。
RSpec.describe Basket, type: :model do
it "has 3 apples" do
basket = FactoryGirl.create(:basket)
basket.apples.length.should == 3
end
end
那个应该通过。
其中一个问题是,你会得到更好的服务,更严格一点
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,所以你需要创建而不是构建
我有一个非常简单的项目。它有一个篮子,里面有 3 个苹果。
我创建了一个新项目并添加了一些 gem。 (包括 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 returns 0 而不是 3。为什么不返回 3,我怎样才能使这个测试通过?
只有在 创建 篮子时才会创建您的苹果。 #build
不创建记录(它类似于 ActiveRecord 的 #new
,它只是初始化而不提交)。
RSpec.describe Basket, type: :model do
it "has 3 apples" do
basket = FactoryGirl.create(:basket)
basket.apples.length.should == 3
end
end
那个应该通过。
其中一个问题是,你会得到更好的服务,更严格一点
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,所以你需要创建而不是构建