我有几个看起来如下的spec文件:
describe "My DSL" do
before :each do
@object = prepare_my_object
end
describe "foo" do
before :each do
@result = @object.read_my_dsl_and_store_stuff_in_database__this_is_expensive
end
it "should do this" do
@result.should be_this
end
it "should not do that" do
@result.should_not be_that
end
# ... several more tests about the state of @result
end
# ...
end
这些测试需要很长时间,主要是因为每次都会运行第二个before :each
块。使用before :all
代替并没有真正帮助,因为它在外部before :each
之前被调用。将所有期望放在一个it
块中会有所帮助,但这被认为是不好的风格。
让我的昂贵方法只执行一次的最佳做法是什么?
答案 0 :(得分:0)
加速rspec的最快方法是完全解耦数据库。 DSL 问题与进入和退出db 问题的问题不同。如果您有两种方法同时执行这两种操作,是否可以将方法分解为多个部分?
理想情况下,您的DSL将在本地缓存,因此无论如何都不必在每次请求时从数据库中提取。它可以在内存中加载一次并在刷新之前保存在那里。
如果针对本地内存缓存运行并解除数据库,那么这会加快速度吗?如果是,那么db调用很慢。如果您的DSL已完全加载到内存中并且测试仍然很慢,那么问题就在于您自己的DSL。