如何在每次测试之前让Rails测试数据库重建?

时间:2009-06-02 15:14:18

标签: ruby-on-rails unit-testing testing

我目前正在开始从灯具迁移到工厂并遇到一些测试数据库挑战。

当我运行整个测试套件时,数据库将被清除,并重新加载新的工厂生成的数据。但是,当我运行单个单元测试时,数据库不会清除旧值。

我可以在每次单独测试之前运行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 个答案:

答案 0 :(得分:1)

首先检查您的测试设置以确保它们是您想要的,但我怀疑您可能有理由不允许在事务中运行测试的标准做法(在退出时回滚)。

其他选择是   (1)手动使用上述测试的交易(没有交易),加上   (2)添加teardown方法手动清除相关表。

答案 1 :(得分:0)

您可以覆盖单元测试中的setup方法,以便删除要清除的数据。

答案 2 :(得分:0)

由于每个测试从干净的数据库开始,因此请尝试将代码库中的内容放到可以为每个测试使用事务的位置。结果会大大提高您的测试质量。

此外,这与您的问题没有直接关系......但在任何情况下都不要使用Rails灯具。改为使用工厂(查看factory_girl_rails gem)。另外,请查看RSpec而不是Test :: Unit。