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

Rspec 哪里是播种我的测试数据的好地方?,rspec,sinatra,Rspec,Sinatra,我的测试依赖于数据库数据。我一直在使用工厂在rspec descripe块中使用before语句动态创建数据 我想把它们移到跑步的开始。在继续使用工厂的同时,有没有一种好方法可以做到这一点?是的,有几种方法可以做到这一点。默认情况下,RSpec语法 before do end 与 before :each do end 这意味着在每个规范之前调用before块中的代码 但是,您也可以使用: before :all do #... end 它为定义它的descripe或其别名上下文块运行

我的测试依赖于数据库数据。我一直在使用工厂在rspec descripe块中使用before语句动态创建数据


我想把它们移到跑步的开始。在继续使用工厂的同时,有没有一种好方法可以做到这一点?

是的,有几种方法可以做到这一点。默认情况下,RSpec语法

before do
end

before :each do
end
这意味着在每个规范之前调用before块中的代码

但是,您也可以使用:

before :all do
  #...
end
它为定义它的descripe或其别名上下文块运行一次封闭代码。但是,您应该小心使用before:all,因为这意味着您的测试将不再独立运行,这取决于您在before:all块中定义的内容

如果要编写在整个套件之前运行一次的代码,还可以在spec\u帮助文件的RSpec配置中定义before:suite和after:suite选项

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

let:foo{FactoryGirl.create:user}

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

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