Ruby on Rails2.3.8:单元测试:Rails / Ruby已设置为在每次测试之前运行。在所有测试之前运行的方法怎么样?

时间:2011-06-21 14:02:04

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

每次运行测试时,我都想初始化数据库,而不是每次测试。 我知道Rspec之前有(:all),但是我还没有能够做到这一点。我想知道铁轨是否有类似的东西。

2 个答案:

答案 0 :(得分:4)

首先:在Test :: Unit中曾经存在一个before(:all)等价物,但它被删除了(不知道为什么)。

其次:有很好的理由不做你想要做的事情 - 测试意味着彼此独立运行,而不是依赖于数据库中的状态。通过这种方式,您可以保证它正在测试完全您期望它进行测试的内容。

如果您有一个更改数据库状态的测试,并且您移动它并且它在另一个期望它成为另一个状态的测试之后运行 - 则会遇到问题。因此,所有测试必须是独立的。

因此:数据库回滚到其原始状态并且每次都重新播种。

如果你真的想要一个db总是在的状态 - 然后在fixtures中设置它......并且只是意识到将为每次测试重新加载db。

如果您在加载时遇到问题...那么请考虑解决问题的其他方法 - 例如,不要使用大量的灯具,而是使用工厂只创建每个人所需的数据测试

如果还有其他原因......请告诉我们 - 我们可能会有解决方案。

编辑:如果你真的需要它,我实际上已经为此写了一段猴子补丁: "faking startup and shutdown"

答案 1 :(得分:2)

在所有事情都出现在课堂顶部之前的所有事情

require 'test_helper'

class ObjectTest < ActiveSupport::TestCase
  call_rake("db:bootstrap RAILS_ENV=test")

  #set up our user for doing all our tests (this person is very busy)  
  @user = Factory(:user)
  @account = Factory(:account)    
  @user.account = @account
  @user.save

  # make sure our user and account got created 
  puts "||||||||||||||||||||||||||||||||||||||||||||||"
  puts "| propsal_test.rb"
  puts "|      #{@user.name}"
  puts "|      #{@user.account.name}"
  puts "||||||||||||||||||||||||||||||||||||||||||||||"