У меня есть модель с отношением друг к другу, это опрос и выбор.Rspec, Factory Girl build with has_many
Как их правильно проверить, потому что ниже код вызывает ActiveRecord::RecordInvalid:
. Я хочу создать родителя (Poll
) и его детей (Choices
) на ходу, вместо того чтобы создать родителя (Poll
), а затем сохранить детей (Choices
) после этого.
Вот коды:
Во-первых, ошибка у меня для всех тестов:
Failure/Error: @poll = FactoryGirl.build(:poll_with_choices, user: @user)
ActiveRecord::RecordInvalid:
Validation failed: Choices choices required at least 2
Опрос Модель:
class Poll < ActiveRecord::Base
belongs_to :user
has_many :choices
accepts_nested_attributes_for :choices
validates :title, presence: true
validates_each :choices do |record, attr, value|
record.errors.add attr, "choices required at least 2" if record.choices.length < 2
end
end
Poll завод:
FactoryGirl.define do
factory :poll do
title { FFaker::Lorem.phrase }
description { FFaker::Lorem.sentences }
user
factory :poll_with_choices do
transient do
choices_count 3
end
after(:build) do |poll, evaluator|
build_list(:choice, evaluator.choices_count)
end
end
end
end
Выбор завода:
FactoryGirl.define do
factory :choice do
label { FFaker::Name.name }
votes 0
poll
end
end
Опрос спецификации
require 'rails_helper'
RSpec.describe Poll, type: :model do
before do
@user = FactoryGirl.create(:user)
@poll = FactoryGirl.build(:poll_with_choices, user: @user)
end
subject { @poll }
it { should respond_to(:title) }
it { should respond_to(:description) }
it { should validate_presence_of(:title) }
it { should belong_to(:user) }
it { should have_many(:choices) }
it { should accept_nested_attributes_for(:choices) }
describe "#save" do
before do
@user = FactoryGirl.create(:user)
end
it "success" do
poll = FactoryGirl.build(:poll_with_choices, user: @user)
expect(poll.save).to eql true
end
it "fail" do
poll = FactoryGirl.build(:poll, user: @user)
poll.choices = FactoryGirl.build_list(:choice, 1)
expect(poll.save).to eql false
end
end
end
В качестве сравнения для FactoryGirl.create
, неFactoryGirl.build
: http://www.rubydoc.info/gems/factory_girl/file/GETTING_STARTED.md#Associations
Спасибо, заранее.
благодарит @BooVeMan, но ничего не меняет. – ruwhan
Хорошо, я вижу проблему в вашем коде.Объект опроса должен существовать, чтобы выбор мог быть добавлен (вам нужен идентификатор для ссылки на выбор), но если вы проверяете существование зависимых объектов (вариантов) до того, как родительский объект существует, вы вызываете проблемы и должны прибегайте к странному коду, как вы. вы должны пересмотреть стратегию проверки. – BooVeMan