在我的Ruby on Rails应用程序中,创建模型Deal时,我使用after_create在DealPrize表上创建奖品。rspec - PG :: UnableToSend:服务器意外关闭了连接这可能意味着服务器异常终止
Deal和DealPrize有一个属于/ has_many的关系:一个交易有很多交易奖品和一个Dealprize属于交易。
它的工作原理是这样的:在我的管理面板(使用activeadmin),在一个交易中,我有一个'奖金号码'专栏,我使用after_create,这样每次管理员创建新交易时,这个奖品号列,并在DealPrize表内创建这个奖品(根据需要插入尽可能多的行)。
我使用rspec和FactoryGirl的测试失败。这可能是由于rspec/factory女孩在prepare_statements中表现不佳。我不确定。
这里是我的代码
型号/ deal.rb
has_many :deal_prizes, dependent: :delete_all
after_create :create_dealprizes
# Constants
TIME_SET = Time.zone.now
CONNECTION = ActiveRecord::Base.connection.raw_connection
def create_dealprizes
begin
CONNECTION.describe_prepared('create_deal_prizes')
rescue PG::InvalidSqlStatementName
CONNECTION.prepare('create_deal_prizes', 'INSERT INTO deal_prizes (deal_id,created_at,updated_at,admin_user_id,prize_id) values ($1, $2, $3, $4, $5)')
end
Deal.transaction do
self.prizes_number.times do |i|
CONNECTION.exec_prepared('create_deal_prizes', [
{ value: self.id},
{ value: TIME_SET },
{ value: TIME_SET },
{ value: self.admin_user_id },
{ value: 5 }
])
end
end
end
这里是我的测试:我想,以确保在创建交易时,如果交易的prizes_number是340,然后应该是Dealprizes表上添加了340行。
require 'spec_helper'
describe DealPrize do
describe "the right number of rows are created inside DealPrize table when a Deal is created" do
before do
@initial_prize_count = DealPrize.count
@deal_prize = FactoryGirl.create(:deal_prize)
@deal = FactoryGirl.create(:deal_prizes => [@deal_prize], :prizes_number => 277)
end
it "does create right nb of rows" do
expect(DealPrize.count).to eq(@initial_prize_count + 277)
end
end
end
我用优惠厂:
FactoryGirl.define do
factory :deal do
country "France"
title "Neque porro quisquam est qui dolorem"
description "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum"
factory :deal_skips_validate do
to_create {|instance| instance.save(validate: false) }
end
end
end
,这里是工厂的DealPrizes:
FactoryGirl.define do
factory :deal_prize do
end
end
这里是我得到的错误:
PG::UnableToSend:
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
如果需要,这里是我如何处理tran saction在我spec_helper.rb
config.use_transactional_fixtures = false
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation, :except => %w(roles))
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, js: true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
您的FactoryGirl用法看起来不正确。你使用什么FG版本? –
编辑了工厂女孩的代码,因为有些部分是不正确的。 – Mathieu
使用最新版本的'宝石'factory_girl_rails'宝石。在我的'宝石列表'我可以阅读:factory_girl(4.5.0,4.0.0) factory_girl_rails(4.5.0,4.4.1,4.0.0) – Mathieu