4

before :all在使用 ActiveRecord 在 Ruby on Rails 2.3 中运行 RSpec 测试时,数据库会在每个示例(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

有什么方法可以保留示例中所做的更改吗?

4

2 回答 2

3

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

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

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end
于 2011-09-14T13:21:12.990 回答
0

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

从技术上讲,您可以简单地编写一个包含多个.should语句的长规范测试,只要所有语句都通过,那么您就有效地获得了您所描述的那种测试。但是,根据我的经验,这并不是真正为您设计的规范。

我想我要说的是,不要试图阻止回滚——这不是它要做的事情。要么使用更设计的工具来执行您要构建的测试类型,要么编写具有多个.should语句的更长的测试。

于 2011-09-14T13:12:33.610 回答