我在测试开始时运行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:
如何才能使前块运行一次。
答案 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