тест rake не копирует развитие postgres db с последовательностями - PullRequest
0 голосов
/ 31 мая 2010

Я пытаюсь разработать приложение rails на postgresql, используя последовательность для увеличения поля вместо рубинового подхода по умолчанию на основе validates_uniqueness_of.

Это оказалось сложным по ряду причин: 1. Это миграция существующей таблицы, а не новой таблицы или столбца 2. Использование параметра: default => "nextval ('seq')" не работает, поскольку он пытается установить его в скобках 3. В конечном итоге миграция работает в 2 этапа:

change_column :work_commencement_orders, :wco_number_suffix, :integer, :null => false#, :options => "set default nextval('wco_number_suffix_seq')"

execute %{
  ALTER TABLE work_commencement_orders ALTER COLUMN wco_number_suffix SET DEFAULT nextval('wco_number_suffix_seq');
}

Теперь, похоже, все сделано правильно в базе данных разработки, и схема выглядит следующим образом:

wco_number_suffix      | integer                     | not null default nextval('wco_number_suffix_seq'::regclass)

Тем не менее, тесты не пройдены с

PGError: ERROR:  null value in column "wco_number_suffix" violates not-null constraint
: INSERT INTO "work_commencement_orders" ("expense_account_id", "created_at", 
"process_id", "vo2_issued_on", "wco_template", "updated_at", "notes", "process_type", 
"vo_number", "vo_issued_on", "vo2_number", "wco_type_id", "created_by", 
"contractor_id", "old_wco_type", "master_wco_number", "deadline", "updated_by", 
"detail", "elective_id", "authorization_batch_id", "delivery_lat", "delivery_long", 
"operational", "state", "issued_on", "delivery_detail") VALUES(226, '2010-05-31 
07:02:16.764215', 728, NULL, E'Default', '2010-05-31 07:02:16.764215', NULL, 
E'Procurement::Process', NULL, NULL, NULL, 226, NULL, 276, NULL, E'MWCO-213', 
'2010-06-14 07:02:16.756952', NULL, E'Name 4597', 220, NULL, NULL, NULL, 'f', 
E'pending', NULL, E'728 Test Road; Test Town; 1234; Test Land') RETURNING "id"

Объяснение можно найти при проверке схемы тестовой базы данных:

wco_number_suffix      | integer                     | not null

Так что же случилось с дефолтом?

Я пытался добавить

task:
    template: smmt_ops_development

в файл database.yml, который выдает

create database smmt_ops_test template = "smmt_ops_development" encoding = 'utf8'

Я проверил, что если я его выдаю, то на самом деле он копирует nextval по умолчанию. Так ясно, что рельсы делают что-то после этого, чтобы снова это подавить.

Есть предложения, как это исправить?

Спасибо Роберт

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Я не решил проблему как таковую, но разработал следующий обходной путь для модели work_commencement_orders для запуска тестов.

###########################################################################
###########################################################################
# NOTE this is purely for test, it should have no effect on development or production
# as the field will be marked readonly and prevented from being written to the db so that
# it picks up a default value from its sequence.
public

def before_validation
  if wco_number_suffix.blank?
    maximum = WorkCommencementOrder::Entity.maximum(:wco_number_suffix)
    maximum ||= 0
    self.wco_number_suffix = maximum + 1
  end
end

private

def test?
  @is_test ||= (ENV['RAILS_ENV'] == 'test')
end

# Override default behaviour so that when not in test environment it does not try
# to write readonly attributes during create but instead allows them to be initialised
# by default value.
def attributes_with_quotes(include_primary_key = true, include_readonly_attributes = test?, attribute_names = @attributes.keys)
  super(include_primary_key, include_readonly_attributes, attribute_names)
end

###########################################################################
###########################################################################
0 голосов
/ 02 августа 2012

Я наткнулся на ту же проблему. Для будущих посетителей

В основном поместите это в ваш config / environment / development.rb и запустите ваши тесты.

    config.active_record.schema_format = :sql

Для получения дополнительной информации - https://rails.lighthouseapp.com/projects/8994/tickets/5849-rails3-rake-task-dbtestprepare-no-longer-handles-stored-procedures

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...