FactoryGirl序列在创建具有关联的对象时不进行实例化

时间:2015-10-14 13:05:28

标签: ruby ruby-on-rails-4 factory-bot

我必须为我拥有的控制器编写一些测试。我有3个模型:User,UserInfo和UserPaymentPreference。我正在使用FactoryGirl来制作这样的UserPaymentPreference对象:

factory :advertiser_payment_preference_sequence do
      association :advertiser_user, factory: [:advertiser_user_sequence]
    end

factory :advertiser_user_sequence, class: 'AdvertiserUser' do
      deposit { rand(100..1000).round(2) }
      sequence(:login) { |n| "#{Faker::Internet.domain_name}#{n}" }
      user_type 'advertiser'
      association :user_info, factory: :advertiser_user_info_sequence

      trait :no_deposit do
        deposit 0
      end
    end

factory :advertiser_user_info_sequence, class: 'AdvertiserUserInfo' do
      sequence(:firstname) { |n| "#{Faker::Name.first_name}#{n}" }
      sequence(:organization) { |n| "#{Faker::Company.name}#{n}" }
      sequence(:phone) { |n| "#{Faker::PhoneNumber.cell_phone}#{n}" }
      sequence(:fiscal_code) { |n| "#{Faker::Company.duns_number}#{n}" }
      sequence(:address) { |n| "#{Faker::Address.street_address}#{n}" }
      sequence(:city) { |n| "#{Faker::Address.city}#{n}" }
    end

如果我执行类似FactoryGirl.build(:advertiser_user_info_sequence)之类的操作,它将正常工作,它将创建一个UserInfo类型的对象,其中所有字段都应该填充。

然而,当我尝试通过执行FactoryGirl.build(:advertiser_payment_preference_sequence)来制作AdvertiserPaymentPreference对象时,所有user_info字段都将是""而不是它应该由关联创建的值。

describe 'Advertiser::Billing::SettingsController', type: :request do
  let!(:campaign) { create :campaign }
  let!(:user) { campaign.user }
  let!(:user_info) { user.user_info }
  let!(:advertiser_payment_preference) { create(:advertiser_payment_preference, advertiser_user_id: user.id)}

  before :each do
    login(user)
  end

  describe "PUT/PATCH /advertiser/billing/settings" do
    context "it is a valid request" do
      it "updates the resource" do
        binding.pry
        new_advertiser_payment_preference = build(:advertiser_payment_preference_sequence)

        binding.pry
        params = {}
        params['user_info'] = to_api_advertiser_info(new_advertiser_user_info)
        api_put '/advertiser/billing/profile', params

        expect(response.status).to eq(200)

        user_info.reload
        expect(user_info.organization).to eq(new_advertiser_user_info.organization)
        expect(user_info.phone).to eq(new_advertiser_user_info.phone)
        expect(user_info.fiscal_code).to eq(new_advertiser_user_info.fiscal_code)
        expect(user_info.country).to eq(new_advertiser_user_info.country)
        expect(user_info.address).to eq(new_advertiser_user_info.address)
      end
    end
  end
end

这是控制器测试的样子。当我调用new_advertiser_payment_preference = build(:advertiser_payment_preference_sequence)时,我得到一个带有""的对象user_info。在使用advertser_user_info_sequence制作的所有字段上。

0 个答案:

没有答案