Factory Girl - Evanto/qna GitHub Wiki
factory_girl GETTING_STARTED
factory_girl Associations
Installation: add factory_girl_rails
gem to your Gemfile:
group :development, :test do
gem 'factory_girl_rails'
end
После добавления гема в папке spec появится папка factories (фабрики): spec/factories. Внутри будут файлы фабрик каждой модели. В этих файлах, в блоке do мы перечисляем все атрибуты, которые хотим определить для каждой вновь создаваемой модели. Например, для модели User для каждого юзера мы хотим иметь атрибуты login, email. В нашем случае мы хотим, чтобы каждый answer создавался с атрибутом question id - то есть, чтобы каждый ответ при создании имел id вопроса.
У каждой фабрики есть имя и набор атрибутов. Надо делать 1 фабрику на каждый класс, указывая простейший набор атрибутов, необходимых для создания экземпляра класса.
factory_girl associations
У фабрик тоже бывают связи: factory_girl associations
- cм. associations for belongs_to
Как в фабрике прописать, чтобы каждый answer создавался с атрибутом соответствующего вопроса?
М.9, фабрика votes.rb:
FactoryGirl.define do
factory :valid_vote do
user
value 1
end
factory :invalid_vote, class: 'Vote' do
user
value 2
end
end
subject
в фабриках и RSpec?
Что такое subject
is the thing under test. With RSpec, it will usually be an instance of the object/class you are testing.
What is subject in factory_girl and RSpec?
subject
в коде теста модели votes м.9:
require 'rails_helper'
RSpec.describe Vote, type: :model do
it { should belong_to :user }
it { should belong_to :votable }
it do
subject.user = FactoryGirl.build(:user)
is_expected.to validate_uniqueness_of(:user_id).scoped_to(:votable_id, :votable_type)
end
it { should validate_inclusion_of(:votable_type).in_array(['Question', 'Answer']) }
it { should validate_inclusion_of(:value).in_array([1,-1]) }
end
subject.user
- тестируемый юзер.
validate_inclusion_of
- мэтчер от shoulda_matchers