【问题标题】:Ruby on Rails - Testing DatabaseRuby on Rails - 测试数据库
【发布时间】:2011-10-02 11:24:58
【问题描述】:

有没有办法防止 Rails 在运行测试之前清除测试数据库?我想使用我的生产数据库的副本进行测试,所以我需要防止 rails 每次都清除数据。

有相当多的数据,所以我想尽可能避免使用固定装置,因为我假设每次都需要很长时间来填充数据库。

谢谢, 迈克

【问题讨论】:

  • 测试的全部意义在于拥有一个充满可预测数据的数据库,这些数据不会从一个测试到另一个测试发生变化。通过使用生产数据,您将失去这种优势。我真的会考虑使用 FactoryGirl 之类的东西来为您模拟数据库数据。

标签: ruby-on-rails testing


【解决方案1】:

您可以通过手动运行测试来避免它

ruby -Itest test/unit/some_test.rb

这是进行测试数据库重建的 rake 任务(您可以像这样手动运行它)

rake db:test:prepare

但我的建议是你做错了。 测试的总体思路是,您知道数据库的状态,因此知道函数的期望值。

例如。

test "search_by_name" do
  expected = User.all.select{|u| u.name =~ /arthur/i}
  assert_equal expected, User.search_by_name("Arthur")
end

是一个很好的测试 但是,如果你不知道db的状态,你怎么知道有一个arthur呢?

上面的测试会在三个不好的情况下通过;

  1. 没有用户记录
  2. 所有用户都被称为“亚瑟”
  3. 没有名为arther的用户。

所以最好创造一个虚假的现实, 我们知道数据库的状态。

我们想要;

  1. 至少一位名为“Arthur”的用户
  2. 至少有一个用户在另一个词中使用了名为“Arthur”的用户
  3. 至少一位非亚瑟用户。

一个更好的测试,假设数据库是空的,并且使用工厂女孩,可能是。

test "search_by_name" do
  expected = [
    Factory.create(:user, :name => "Arthur"),
    Factory.create(:user, :name => "MacArthur")
  ]
  not_expected = [Factory.create(:user, :name => "Archer")]
  assert_equal expected, User.search_by_name("Arthur")
end

【讨论】:

  • 这不起作用。 ruby -Itest... 命令从我的表中删除了数据。架构保持不变,但数据已被删除。但是,您关于已知数据的观点是正确的。我现在正在使用测试进行 UI 验证,所以我想使用生产数据,以便我看到(并测试)用户看到的内容。但更好的方法可能是获取我需要的表格,创建固定装置/种子并这样做。感谢您的详尽回答,我很感激
【解决方案2】:

让我先说您通常不想使用生产数据进行测试。话说……

您可以加载“种子”数据,但请确保您没有任何固定装置,否则每次测试运行都会将其删除。

请参阅this answer 了解自动播种数据的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    相关资源
    最近更新 更多