哪里是种植我的测试数据的好地方?

时间:2013-08-28 02:46:10

标签: rspec sinatra

我有依赖db数据的测试。我一直在使用工厂在rspec describe blocks中使用before语句动态创建数据。

我想把它们移到跑步的开始。在继续使用工厂的同时,还有一个很好的方法吗?

1 个答案:

答案 0 :(得分:0)

是的,有几种方法可以解决这个问题。默认情况下,RSpec语法

before do
end

相同
before :each do
end

这意味着在每个规范之前调用before块中的代码。

但是,您也可以使用:

before :all do
  #...
end

运行封闭代码ONCE,用于描述它的describe(或其别名上下文)块。但是,您应该小心使用before :all,因为这意味着您的测试将不再孤立地运行,具体取决于您在before :all块中定义的内容。

如果要编写在整个套件之前运行一次的代码,那么还可以在(:suite)和after(:suite)之前选择,您可以在spec_helper文件中的RSpec配置中定义。

更常见的方法是使用名为'let'的RSpec方法,该方法接受一个参数和一个块。它看起来像这样:

let(:foo){FactoryGirl.create:user}

简而言之,let方法创建了一个方法别名foo,它返回返回块的值(上例中的FactoryGirl.create :user)。好处是(1)它缓存这个变量,因此块只获得一次,(2)它被懒惰地评估,所以它只运行并在你的测试中调用foo后缓存块中的值。重要的是要记住,有时这种懒惰的评估会在某些情况下导致意外行为。您可以使用let!来防止延迟加载。 let方法在任何before语句之前运行,因此您可以使用let块中before定义的任何方法。

最后,还有一个名为FactoryGirl Seeds的项目,它允许您在spec_helper中定义仅运行一次的生成器。没有亲自使用它太多,所以我不确定它有多可靠,但你可以在这里找到更多信息:

https://github.com/evrone/factory_girl-seeds