RSpec:关联对象的工厂定义

Raj*_*hra 6 rspec ruby-on-rails factory-bot

我有以下三个模型:Product,WarehouseInventory

# app/models/product.rb
class Product < ApplicationRecord
  has_many :inventories
  has_many :warehouses, through: :inventories  
end

# app/models/warehouse.rb
class Warehouse < ApplicationRecord
  has_many :inventories
  has_many :products, through: :inventories
end

# app/models/inventory.rb
class Inventory < ApplicationRecord
  belongs_to :product
  belongs_to :warehouse
end
Run Code Online (Sandbox Code Playgroud)

我有这个库存工厂:

FactoryBot.define do
  factory :inventory do
    product { nil }
    warehouse { nil }
    item_count { 1 }
    low_item_threshold { 1 }
  end
end
Run Code Online (Sandbox Code Playgroud)

我如何将这个工厂用于库存,或者我的其他工厂需要进行哪些更改,以便我可以拥有这样的规范?

RSpec.describe Inventory, type: :model do
  it "has a valid factory" do
   expect(FactoryBot.build(:inventory)).to be_valid
  end
end
Run Code Online (Sandbox Code Playgroud)

Grz*_*orz 6

你需要的是改变:inventory工厂定义,像这样

FactoryBot.define do
  factory :inventory do
    product
    warehouse
    item_count { 1 }
    low_item_threshold { 1 }
  end
end
Run Code Online (Sandbox Code Playgroud)

这将“告诉”工厂机器人实例化关联的对象(https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#associations

但是要使其工作,您需要定义warehouseproduct工厂。


CaT*_*aTs 0

如果工厂作为符号,则可以使用 或create方法传递名称:build

  it "has a valid factory" do
   expect(create(:inventory)).to be_valid
 end

  # OR

  it "has a valid factory" do
   expect(build(:inventory)).to be_valid
 end
Run Code Online (Sandbox Code Playgroud)

create将保存模型,同时build简单地实例化它。如果您在装载工厂时遇到困难,请确保它们位于正确的位置