我有依赖db数据的测试。我一直在使用工厂在rspec describe blocks中使用before语句动态创建数据。
我想把它们移到跑步的开始。在继续使用工厂的同时,还有一个很好的方法吗?
答案 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中定义仅运行一次的生成器。没有亲自使用它太多,所以我不确定它有多可靠,但你可以在这里找到更多信息: