https://github.com/odlp/factory_bot_variants
Shorthand syntax for creating multiple variants with FactoryBot
https://github.com/odlp/factory_bot_variants
factory-bot factory-bot-rails
Last synced: 11 months ago
JSON representation
Shorthand syntax for creating multiple variants with FactoryBot
- Host: GitHub
- URL: https://github.com/odlp/factory_bot_variants
- Owner: odlp
- License: mit
- Created: 2018-09-28T10:05:58.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-03-17T03:51:37.000Z (about 3 years ago)
- Last Synced: 2025-04-06T12:13:25.699Z (about 1 year ago)
- Topics: factory-bot, factory-bot-rails
- Language: Ruby
- Size: 19.5 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE.txt
Awesome Lists containing this project
README
# FactoryBotVariants
In tests it's common to create several objects which vary by only one or two
attributes (particularly when asserting the order, or filtering, of entities):
```ruby
it "sorts dogs oldest to youngest" do
dog_1 = build(:dog, name: "Fido", age: 5)
dog_2 = build(:dog, name: "Benji", age: 10)
dog_3 = build(:dog, name: "Spot", age: 1)
expect(DogSorter.new.sort).to eq [dog_2, dog_1, dog_3]
end
```
With `FactoryBotVariants` you could write this as:
```ruby
dog_1, dog_2, dog_3 = build_variants(:dog, names: ["Fido", "Benji", "Spot"], ages: [5, 10, 1])
```
You can specify attribute names in plural if you like; `names` will become
`name` as the attributes are passed to your factory.
If you have common attributes to assign to each variant, use the `:all` key:
```ruby
build_variants(:dog, names: ["Brutus", "Avril"], all: { cute: false })
```
## Installation
In your gemfile:
```ruby
group :test do
gem "factory_bot_variants"
end
```
Then `bundle install` and include the DSL where you'd like to use it:
### In specific tests
```ruby
require "factory_bot_variants/dsl"
RSpec.describe Dog do
include FactoryBotVariants::DSL
# Your spec
end
```
### In all specs
```ruby
require "factory_bot_variants/dsl"
RSpec.configure do |config|
config.include FactoryBotVariants::DSL
end
```
## API
There's an equivalent `_variants` method per [FactoryBot strategy][strategies]:
[strategies]: https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#using-factories
- `build_variants`
- `create_variants`
- `attributes_for_variants`
- `build_stubbed_variants`
Arguments:
1. Factory name
1. Traits (optional)
1. One or more variant attributes
Example:
```ruby
build_variants(
factory_name,
trait,
attr1: [:a, :b],
attr2: [1, 2],
all: { common_attr: 1 },
)
```