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

validate_inclusion_of shoulda_matchers