ruby-on-rails - has_many 与 Factorygirl 进行关联测试

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

我有一个非常简单的项目。它有一个篮子,里面有 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

这是篮子规范.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,如何才能使该测试通过?

最佳答案

问题之一是,如果你更严格一点,会更好

 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,所以需要create而不是build

关于ruby-on-rails - has_many 与 Factorygirl 进行关联测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31820465/

相关文章:

ruby-on-rails - RSpec - 共享数据库连接。交易固定装置不工作

testing - 为什么这个应该返回 nil 的 stub 方法返回其他东西?

ruby-on-rails - 在 Ruby 的构建器中自定义节点名称

ruby - 如何在 Ruby 中快速生成字符串的所有排列?

ruby-on-rails - 将 RoR 部署到 Heroku 和 Sqlite3 失败

mysql - rails : Use of 'foreign_key'

Ruby 从预先存在的 key 字符串创建密码 key

ruby-on-rails - RSpec 异常后继续

mysql - ActiveRecord 未定义方法 `has_key?' for nil :NilClass error

ruby-on-rails - 如何在 Ransack 中获得条件组?