2011-09-14 106 views
3

当使用ActiveRecord在Ruby on Rails 2.3中运行RSpec测试时,数据库在每个示例(it块)之后回滚到before :all块之后的状态。在Ruby on Rails中防止规范中的数据库回滚?

但是,我想规定一个对象的生命周期,这意味着要逐个检查一些示例,更改状态并测试后置条件。回滚行为是不可能的。

所以澄清:

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 

是否有某种方式来坚持实例所做的更改?

回答

0

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

从技术上讲,你可以简单地写一个长规格测试,用多个.should声明,只要所有声明都通过了,那么你就可以有效地得到你所描述的那种测试。然而,根据我的经验,这不是真正的设计规范。

我猜我在说的是,不要试图阻止回滚 - 这不是它要做的。可以使用更多设计用于执行您正在构建的各种测试的工具,也可以编写具有多个.should语句的较长测试。

+0

嗯,谢谢我的猜测。 TBH,我根本不喜欢Cucumber(它打破了DSL最终仍然是一种编程语言的基本原则,不应该试图看起来太“自然”),只是想尽量避免使用它。 – Nicos

+0

是的,我和黄瓜有类似的问题,因为不管语言看起来如何“自然”,计算机在解释过程中仍然过于具体以真正知道用户*意味着什么*在非常严格的词汇表之外当然,通过步骤定义来定义)。但是,Cucumber的目标之一是也允许非程序员理解Cucumber测试正在做什么,因此可以根据用户体验和做什么来选择它们,而不是完成它们的底层系统。 – jefflunt

+0

他们对COBOL说了同样的话,最终只有受过良好训练的人才能使用COBOL。在这一点上,我真的在做“扩展单元测试”和布局原子商业逻辑,而不是集成,所以测试框架的范围是模棱两可的,但是对单元测试高度倾斜,所以我宁愿围绕回滚工作来付出代价运行时间更长的规格。 – Nicos

2

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

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

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