Как заставить тестовую базу данных Rails перестраивать перед каждым тестом? - PullRequest
7 голосов
/ 02 июня 2009

В настоящее время я начинаю переход от осветительных приборов к фабрикам и сталкиваюсь с некоторыми проблемами в тестовой базе данных.

Когда я запускаю весь свой набор тестов, база данных очищается и новые сгенерированные на заводе данные перезагружаются. Однако при запуске отдельных модульных тестов база данных не очищает старые значения.

Я мог бы запустить rake db: test: prepare перед каждым отдельным тестом, но это замедлило бы мою разработку.

Вот мои настройки теста:

  self.use_transactional_fixtures = false
  self.use_instantiated_fixtures  = true

Например:

require File.dirname(__FILE__) + '/../test_helper'
class LocationTest < ActiveSupport::TestCase
  test "should require name to save" do
    location = Factory.create(:location)
  end
end

будет успешно запущен один раз, но при последующих запусках тестового файла произойдет сбой. Этого раньше никогда не было, потому что тестовые приборы загружались при каждом запуске.

Я добавил фабричную последовательность, но только последовательности атрибутов во время каждого запуска:

  Factory.define :location do |l|
    l.sequence(:name) {|n| "place#{n}"}
    l.street  '123 N Pitt Street'
    l.state_id 4
    l.city 'San Francisco'
    l.location_type_id LocationType::COMMON
    l.shipper_id 1
    l.zip 23658
  end

Результат:

trunk>ruby test\unit\location_test.rb
Loaded suite test/unit/location_test
Started
.
Finished in 0.162 seconds.

1 tests, 0 assertions, 0 failures, 0 errors

>ruby test\unit\location_test.rb
Loaded suite test/unit/location_test
Started
E
Finished in 0.134 seconds.

  1) Error:
test_should_require_name_to_save(LocationTest):
ActiveRecord::RecordInvalid: Validation failed: Name has already been taken
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/proxy/create.rb:5:in `result'
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:293:in `run'
    c:/ruby/lib/ruby/gems/1.8/gems/thoughtbot-factory_girl-1.2.1/lib/factory_girl/factory.rb:237:in `create'
    test/unit/location_test.rb:18:in `test_should_require_name_to_save'

1 tests, 0 assertions, 0 failures, 1 errors

Ответы [ 3 ]

1 голос
/ 02 июня 2009

Сначала проверьте настройки теста, чтобы убедиться, что они соответствуют вашим требованиям, хотя я подозреваю, что у вас может быть причина запретить стандартную практику выполнения теста в транзакции (которая откатывается при выходе).

Другие варианты (1) Вручную используйте транзакции для тестов, подобных приведенному выше (где транзакция еще не выполнена), плюс (2) Добавьте метод teardown для ручной очистки соответствующих таблиц.

0 голосов
/ 02 ноября 2011

Поскольку каждый тест должен начинаться с чистой базы данных, попытайтесь привести вещи в своей кодовой базе к точке, в которой вы сможете использовать транзакции для каждого теста. В результате качество вашего теста значительно улучшится.

Кроме того, это не имеет прямого отношения к вашему вопросу ... но никогда ни в коем случае не используйте приборы Rails ни при каких обстоятельствах. Вместо этого используйте фабрики (проверьте драгоценный камень factory_girl_rails). Также проверьте RSpec вместо Test :: Unit.

0 голосов
/ 02 июня 2009

Вы можете переопределить метод setup в своем модульном тесте, чтобы он удалял данные, которые вы хотите очистить.

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