在每次测试之前,rspec中的块运行之前它应该只运行一次

时间:2018-06-12 15:44:26

标签: ruby-on-rails ruby rspec

我在测试开始时运行before do。我希望在运行测试之前执行一次before to。但是目前它在每次测试之前运行:

context "worker has failed first time and has generated only part of licenses" do
      before do
        order.already_went_through_license_worker = true
        order.save!
        order.pre_calculate_licenses
        partial_generate_from_bundles(order.expected_license_bundles)
        LicenseService.new.create_from_order(order.id)
      end
      let!(:licenses){ License.where(order_id: order.id)}
      specify { subject.count.should == 34 }
      specify { subject.pluck(:is_from_offer_special).count(true).should == 4}
      specify { subject.pluck(:is_from_offer_special).count(false).should == 30 }
      specify { subject.pluck("license_offer.offer_original_id").compact.map(&:values).flatten.count(offer.id).should == 30}
      specify { subject.pluck("license_offer_special.offer_special_original_id").compact.map(&:values).flatten.count(offer_special_cyclic.id).should == 3}
      specify { subject.pluck("license_offer_special.offer_special_original_id").compact.map(&:values).flatten.count(offer_special_non_cyclic.id).should == 1 }
    end

当我将其更改为之前(:all)时,我收到错误:

 let declaration `order` accessed in a `before(:context)` hook at:

如何才能使前块运行一次。

2 个答案:

答案 0 :(得分:1)

如果没有其他帮助,您可以使用一个 specify阻止方法:

specify do 
 subject.count.should == 34
 subject.pluck(:is_from_offer_special).count(true).should == 4
 #...
end

但是这有一个缺点:如果一个期望失败,那么之后的那个将不会运行。但是如果你aggregate failures

,你可以解决这个问题
specify aggregate_failures: true do 
 subject.count.should == 34
 subject.pluck(:is_from_offer_special).count(true).should == 4
 #...
end

答案 1 :(得分:1)

  

如何才能使前块运行一次。

before(:all),你已经做到了。

  

当我将其更改为before(:all)时,我收到错误消息:

这是一个完全不相关的错误。您的阻止 仅运行一次,这就是您的要求。这里的问题是上下文级别块正在尝试访问示例级声明。有点像尝试从类方法中访问实例变量:这些变量还不存在!

一种可能的方法是内联所有依赖项(不要使用let,将代码直接放入块中):

before :all do
  order = create :order # or whatever
  order.already_went_through_license_worker = true
  order.save!
  ...
end