Skip to content

Commit a9d112b

Browse files
committed
Add FixtureBot.require for loading fixtures from multiple files
1 parent 4e2e551 commit a9d112b

4 files changed

Lines changed: 88 additions & 0 deletions

File tree

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,40 @@ end
346346

347347
In Rails, this is auto-detected from the database.
348348

349+
### Multiple files
350+
351+
For larger apps, split fixtures across multiple files using `FixtureBot.require`:
352+
353+
```ruby
354+
# spec/fixtures.rb
355+
FixtureBot.require "spec/fixtures/**/*.rb"
356+
357+
FixtureBot.define do
358+
user.email { |fixture| "#{fixture.key}@example.com" }
359+
end
360+
```
361+
362+
```ruby
363+
# spec/fixtures/users.rb
364+
FixtureBot.define do
365+
user :brad do
366+
name "Brad"
367+
end
368+
end
369+
```
370+
371+
```ruby
372+
# spec/fixtures/posts.rb
373+
FixtureBot.define do
374+
post :hello do
375+
title "Hello"
376+
author :brad
377+
end
378+
end
379+
```
380+
381+
Each file calls `FixtureBot.define` with its own block. Files are loaded in alphabetical order. References across files work because everything is resolved after all files are loaded.
382+
349383
### Implicit vs explicit style
350384

351385
By default, the block is evaluated implicitly. Table methods like `user` and `post` are available directly:

lib/fixturebot.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ def self.define(schema = nil, &block)
2929
end
3030
end
3131

32+
def self.require(glob)
33+
Dir.glob(glob).sort.each { |f| load f }
34+
end
35+
3236
def self.define_from_file(schema, fixtures_path)
3337
definition = Definition.new(schema)
3438
Thread.current[:fixturebot_definition] = definition

lib/generators/fixturebot/templates/fixtures.rb.tt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
FixtureBot.require "<%= rspec? ? "spec" : "test" %>/fixtures/**/*.rb"
2+
13
FixtureBot.define do
24
# Define your fixtures here. Example:
35
#

spec/fixturebot_spec.rb

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# frozen_string_literal: true
22

3+
require "tmpdir"
4+
35
RSpec.describe FixtureBot do
46
it "has a version number" do
57
expect(FixtureBot::VERSION).not_to be nil
@@ -146,6 +148,52 @@
146148

147149
end
148150

151+
describe ".require" do
152+
let(:schema) do
153+
FixtureBot::Schema.define do
154+
table :users, singular: :user, columns: [:name, :email]
155+
table :posts, singular: :post, columns: [:title, :author_id] do
156+
belongs_to :author, table: :users
157+
end
158+
end
159+
end
160+
161+
it "loads fixture files from a glob" do
162+
Dir.mktmpdir do |dir|
163+
subdir = File.join(dir, "fixtures")
164+
Dir.mkdir(subdir)
165+
166+
File.write("#{subdir}/users.rb", <<~RUBY)
167+
FixtureBot.define do
168+
user :alice do
169+
name "Alice"
170+
email "alice@example.com"
171+
end
172+
end
173+
RUBY
174+
175+
File.write("#{subdir}/posts.rb", <<~RUBY)
176+
FixtureBot.define do
177+
post :hello do
178+
title "Hello"
179+
author :alice
180+
end
181+
end
182+
RUBY
183+
184+
File.write("#{dir}/fixtures.rb", <<~RUBY)
185+
FixtureBot.require "#{subdir}/*.rb"
186+
RUBY
187+
188+
result = FixtureBot.define_from_file(schema, "#{dir}/fixtures.rb")
189+
190+
expect(result.tables[:users][:alice][:name]).to eq("Alice")
191+
expect(result.tables[:posts][:hello][:title]).to eq("Hello")
192+
expect(result.tables[:posts][:hello][:author_id]).to eq(result.tables[:users][:alice][:id])
193+
end
194+
end
195+
end
196+
149197
describe "unknown method errors" do
150198
let(:schema) do
151199
FixtureBot::Schema.define do

0 commit comments

Comments
 (0)