Ruby on Rails - 测试数据库

hoi*_*omt 4 testing ruby-on-rails

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

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

谢谢,迈克

Mat*_*udy 6

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

ruby -Itest test/unit/some_test.rb
Run Code Online (Sandbox Code Playgroud)

执行测试数据库重新创建的rake任务(您可以像这样手动运行)

rake db:test:prepare
Run Code Online (Sandbox Code Playgroud)

但我的建议是,你做错了.测试中的一般想法是,您知道数据库的状态,因此知道对函数的期望.

例如.

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

是一个很好的测试,但是,如果你不知道数据库的状态,你怎么知道有一个亚瑟?

上述测试将通过三个不良案例;

  1. 没有用户记录
  2. 所有用户都被称为"亚瑟"
  3. 没有用户称为arther.

因此,更好地创建虚假现实,我们知道数据库的状态.

我们想要;

  1. 至少有一个用户名为"Arthur"
  2. 至少有一个名为"Arthur"的用户作为另一个单词的一部分
  3. 至少有一个非亚瑟用户.

一个更好的测试,假设db是空的,并且使用工厂女孩,可能是.

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
Run Code Online (Sandbox Code Playgroud)