Перед блоком в rspec выполняется перед каждым тестом, когда он должен запускаться только один раз - PullRequest
0 голосов
/ 12 июня 2018

Я запускаю 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

Когда я изменяю его на before (: all), я получаю сообщение об ошибке:

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

Как я могу сделать доблок запускается только один раз.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Как сделать так, чтобы предыдущий блок запускался только один раз.

before(:all), вы уже это сделали.

Когда я изменил его на before(:all) Я получаю ошибку:

Это другая, совершенно не связанная ошибка.Ваш блок работает только один раз, как вы и просили.Проблема здесь в том, что блок уровня контекста пытается получить доступ к объявлениям уровня примера.Вроде как попытка получить доступ к переменным экземпляра из методов класса: эти переменные еще не существуют!

Один из возможных подходов - встроить все зависимости (не используйте let, поместите код непосредственно в блок):

before :all do
  order = create :order # or whatever
  order.already_went_through_license_worker = true
  order.save!
  ...
end
0 голосов
/ 13 июня 2018

Вы можете использовать один specify блочный подход, если больше ничего не помогает:

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

Но у этого есть один недостаток: если одно ожидание не сработает, те, которые после него не будут выполняться,Но вы можете это исправить, если у вас совокупные сбои

specify aggregate_failures: true do 
 subject.count.should == 34
 subject.pluck(:is_from_offer_special).count(true).should == 4
 #...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...