gpt4 book ai didi

ruby-on-rails - Rspec,使用 has_many 构建的 Factory Girl

转载 作者:行者123 更新时间:2023-12-01 23:42:35 24 4
gpt4 key购买 nike

我有一个具有一对多关系的模型,它们是 Poll 和 Choice。

我该如何正确测试它们,因为下面的代码导致 ActiveRecord::RecordInvalid:。我想随时随地创建父级 (Poll) 及其子级 (Choices),而不是先创建父级 (Poll) 然后再创建父级 (Poll)之后保存 child (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

投票工厂:

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

提前致谢。

最佳答案

最后我使用 FactoryGirl trait 和 attributes

这是 poll 工厂代码:

FactoryGirl.define do
factory :poll do
title { FFaker::Lorem.phrase }
description { FFaker::Lorem.sentences }
user
choices_attributes { [FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice)] }

trait :with_many_choices do
choices_attributes { [
FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice),
FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice),
FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice)
] }
end

trait :with_invalid_choices do
choices_attributes { [FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice), FactoryGirl.attributes_for(:choice, label: '')] }
end

trait :with_lack_of_choices do
choices_attributes { [FactoryGirl.attributes_for(:choice)] }
end

trait :without_choices do
choices_attributes { [] }
end
end
end

引用资料(感谢):

关于ruby-on-rails - Rspec,使用 has_many 构建的 Factory Girl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32450502/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com