Ruby on rails 如何使我的规格运行得更快?

Ruby on rails 如何使我的规格运行得更快?,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我有几个规范文件,如下所示: 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"

我有几个规范文件,如下所示:

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:all
并没有真正的帮助,因为它在before:each
之前被调用。将所有期望放在一个
it
块中会有所帮助,但这被认为是不好的风格


让我昂贵的方法只执行一次的最佳实践是什么?

加速rspec的最快方法是完全解耦数据库。DSL问题与数据库进出问题是不同的。如果你有一种方法同时做这两件事,有可能把这个方法分成几部分吗

理想情况下,您的DSL将在本地缓存,因此它不必在每次请求时都从数据库中提取。它可以在内存中加载一次,并在刷新之前保存在内存中


如果您运行的是本地内存缓存,并将数据库解耦,这会加快速度吗?如果是的话,那么是db呼叫太慢了。如果您的DSL已在内存中完全加载,并且测试仍然很慢,那么问题在于您的DSL本身。

谢谢。我的DSL由第三方gem计算,这是测试定制DSL的建议方法。我最希望的是,在外部
before:each
块之后,在
descripe
块内部运行一个
before:all
。类似的东西。你能把
准备我的对象
放在
:all
块中吗?我想到了,但这会与其他测试冲突(这里没有显示)。这会以什么方式与其他测试冲突?它会与该文件中的其他测试冲突,这取决于前面的
:each
。在我问了这个问题并思考了更多之后,我的结论是根据我的规格的这一部分进行定制。A
before:all
块将成为解决方案的一部分。谢谢大家!!