【发布时间】:2011-09-19 13:45:35
【问题描述】:
我想在每次运行测试时初始化数据库一次,而不是每次测试。 我知道 Rspec 有 before(:all),但我无法让它工作。我想知道rails是否有类似的东西。
【问题讨论】:
标签: ruby-on-rails ruby unit-testing testing
我想在每次运行测试时初始化数据库一次,而不是每次测试。 我知道 Rspec 有 before(:all),但我无法让它工作。我想知道rails是否有类似的东西。
【问题讨论】:
标签: ruby-on-rails ruby unit-testing testing
首先:在 Test::Unit 中曾经有一个 before(:all) 等价物,但它被删除了(不知道为什么)。
其次:有很好的理由不做你想做的事情 - 测试应该彼此独立运行,而不是依赖于数据库中的状态。通过这种方式,您可以保证它正在测试完全您期望它测试的内容。
如果您有一个更改数据库状态的测试,并且您移动它并且它在另一个预期它是另一种状态的测试之后运行 - 您会遇到问题。因此,所有测试都必须是独立的。
因此:数据库会回滚到其原始状态并每次重新播种。
如果您真的想要 db 始终处于某种状态 - 然后在夹具中设置它...然后意识到每次测试都会重新加载 db。
如果您在加载时间方面遇到问题...然后考虑找出解决问题的其他方法 - 例如,不要使用大量的固定装置,而是使用工厂只为每个人创建您需要的数据测试。
如果有其他原因...请告诉我们 - 我们可能有解决方案。
编辑:如果你真的需要它,我其实早就为此写了一个猴子补丁: "faking startup and shutdown"
【讨论】:
所有东西都运行在所有东西都进入类的顶部之前
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 "||||||||||||||||||||||||||||||||||||||||||||||"
【讨论】: