防止Ruby on Rails中的规范中的数据库回滚?

时间:2011-09-14 13:07:09

标签: ruby activerecord rspec ruby-on-rails-2

在带有ActiveRecord的Ruby on Rails 2.3上运行RSpec测试时,数据库会在每个示例(before :all块)之后的it块之后回滚到状态。

但是,我想指定一个对象的生命周期,这意味着逐个浏览一些例子,改变状态并测试后置条件。回滚行为无法实现这一点。

所以澄清一下:

describe MyModel
  before :all { @thing = MyModel.create }

  it "should be settable" do
    lambda { @thing.a_number = 42 }.should_not raise_exception
  end

  it "should remember things" do
    @thing.a_number.should == 42
    # this fails because the database was rolled back ☹
  end
end

是否有某种方法可以保留示例中的更改?

2 个答案:

答案 0 :(得分:2)

我同意normalocity,在这种情况下,使用包含两个断言的单个规范看起来会更好。

在某些情况下,关闭回滚很有帮助,例如:对于使用Capybara和Selenium的更高级别测试,在这种情况下,您可以使用use_transactional_fixtures配置选项。你可以把这个

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end

答案 1 :(得分:0)

那么,这取决于你想要做什么。如果你正在测试生命周期(随着时间的推移发生的一系列事情),那么更多的是集成测试领域,你可以在诸如Cucumber等工具中构建更多.Spec更适合做小的小测试代码。

技术上你可以简单地编写一个带有多个.should语句的长规范测试,只要它们都通过,那么你就可以有效地得到你所描述的那种测试。然而,根据我的经验,这并不是真正的,旨在为您提供什么规范。

我想我所说的是,不要试图阻止回滚 - 这不是它的目的。要么使用更多设计用于执行您要构建的测试的工具,要么编写具有多个.should语句的更长测试。