2009-12-14 29 views
13

我使用seeds.rb填充某些国家模型参考数据:防止Rails的测试

State.create :name => 'Alabama', :abbreviation => 'AL' 
State.create :name => 'Alaska', :abbreviation => 'AK' 
# ... 

虽然我不使用状态固定装置(因为它的种子数据,首先,我认为这不需要DRY来完全复制这个测试),Rails测试框架似乎在测试过程中删除了所有状态种子数据。 (我正在删除,重新创建,迁移和重新生成测试数据库,并且确认数据在单元测试运行之前已经存在。)

结果是此断言在seeds.rb中成功,但在单行测试中失败:

assert_equal 51, State.all.size 

1) Failure: 
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]: 
<51> expected but was 
<0>. 
1 tests, 1 assertions, 1 failures, 0 errors 

我试图在基础测试类灯具声明都明确列出非国家模型,以及翻转事务灯具标志(如预期,这只会影响在测试过程中创建的记录)。自然,考虑中的测试本身并不会删除这些记录。

状态记录总是被删除。有没有办法告诉Rails从种子数据中脱颖而出?我是否需要复制装置中的所有数据以确保重新装载?由于没有发生重大政治事件,我预计国家数据会相对稳定。

TIA

+0

谢谢你们,我会尽量都卢克的(一次性)和weppos'(在设置)建议为明确加载种子测试中的数据并查看哪一个最适合我的目的。我会把它看作是一个测试只会首先核实数据库数据。 – aaron

回答

12

测试从数据库中删除所有数据,然后加载您的灯具(如果您有任何)。

您需要让测试助手在测试运行之前加载种子文件。有几个方法可以做到这一点,看看我的类似的问题:How to load db:seed data into test database automatically?

最简单的方法可能只是为了

require "#{Rails.root}/db/seeds.rb"

添加到您的test_helper.rb中文件的顶部(假设你使用内置的测试框架)。

+1

这对我不起作用,如果我将该行添加到我的夹具中,它工作正常,但是如果我将它放在test_helper.rb中,种子数据在我的测试达到之前似乎已经消失。 – dangerousdave

+3

您是否有固定的yml文件供您尝试在种子文件中填充的类使用?因为这会在灯具运行时吹走所有数据。删除种子的夹具文件;或者如果你不能这样做,那就使用Simone的例子,在每次测试之前加载夹具数据。 –

+0

啊,我已经注释掉了我的.yml文件,但是这似乎还不够,它的存在会导致种子数据被覆盖。删除它,一切都很好,谢谢你的帮助卢克 – dangerousdave

4

“种子”功能没有集成到测试架构中。测试是围绕灯具构建的,每次运行测试套件时,Rails都会从灯具加载数据并替换现有内容。

但是,使用种子数据填充数据库非常简单。

在您的test_helper.rb文件中,在基类ActionSupport::TestCase类中添加一个新的设置方法。

class ActionSupport::TestCase < ... 

    setup :load_seeds 

    protected 

    def load_seeds 
     load "#{Rails.root}/db/seeds.rb" 
    end 

end 
+0

这将在每个测试用例之前重新载入您的种子数据,这些测试用例可能不需要做交易装置。只要种子数据应该保持不变(它应该),你只需要加载它一次。 –

+0

这就是我认为的卢克,但无论如何,它似乎被删除,所以它听起来像我将不得不实施某种解决方法,以确保它存在于测试数据库。 – aaron

+1

你的fixtures目录中是否有state.yml文件?即使它是空的,它也会导致你的状态数据被删除。我总是确保删除我的种子数据表中的灯具(实际上我不再使用灯具,但这是另一回事)。 –

0

我同意weppos为做到这一点的最好办法,但为了完整起见,并为人民着想谁可能已经有测试数据中可以采取其他办法,从种子数据库现有的装置。

这是通过做这样的事情在db/seeds.rb文件中的下列完成

RAILS_FIXTURES = "#{Rails.root}/spec/fixtures" 

models_loaded_from_fixtures = %w[Modela Modelb Modelc ....] 

models_loaded_from_fixtures.each do |model| 
    Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}") 
    puts "Loaded #{model.constantize.all.size} #{model.pluralize}" 
end 

你可以交替阅读fixures目录,并创建文件名的数组来处理,我选择了上述过程因为我希望能够指定我希望给DB带来多少现有固定装置中的哪一个。

0

我质疑首先需要写这样的测试。您是否测试了种子数据耙子任务是否正常工作,或者您是否想测试您的State类实现的行为?我假设后者,所以我会编写关注行为的测试,并使用Factory Girl(或类似的),因为您提到您不使用灯具。请务必从test/test_helper.rb中删除fixtures :all行。

为了注射任务进入运行测试的正常流动,这是一个办法,一直为我工作:

namespace :test do 
    task :force_environment do 
    ENV['RAILS_ENV'] = 'test' 
    RAILS_ENV.replace('test') 
    end 
end 

%w(test:units test:functionals test:integration).map do |task_name| 
    task = Rake::Task[task_name] 
    task.clear_prerequisites 

    task.enhance %w(db:test:prepare test:force_environment db:seed) 
end 

只要把在一个名为lib/tasks/testing.rake,它会得到回升,当你接下来运行rake test或其他测试相关的任务。

+0

嗨,帕特里克。实际上我不需要测试状态模型本身,这只是一个示例,说明种子数据不存在。状态模型(参考数据)用于验证地址,地址验证测试失败,因为状态数据不在数据库中。 – aaron

+0

这样做更有意义。 Rake任务应该为你工作,但听起来像你有事情的工作。 –

0

我有同样的问题,但标准答案不适用于我。

我的问题涉及的地方在类文件做了常量和named_scopes的数据库查找。我无法找到任何方法在正确的时间加载种子数据。

我确实找到了一种旁路删除的方法,即使我已经删除了缺少的表的夹具文件,这种情况也发生了。

RAILS_ENV =测试耙分贝:种子 红宝石-Itest测试/单位/ * RB

相关问题