Загрузите файл в rspec перед блоком VS загрузите их один раз - PullRequest
0 голосов
/ 28 мая 2019

Сегодня я пытаюсь ускорить мой набор тестов. Мое приложение в основном является большим интегратором между системами, поэтому в большинстве моих тестов используются макеты Савона, подобные этому

RSpec.describe MyClass do

  describe 'a function which sends a SOAP request'do
    before do
      savon.mock!
      savon.expects(action).returns(File.read("spec/fixtures/somefile.xml"))
    end

    after { savon.unmock! }

    it 'checks something'
    it 'checks something else'
    it 'checks something more'
    it 'checks something different'
  end
end

Очевидно, что большинство этих тестов довольно медленные, так как они загружают файл. Более того, иногда эти макеты находятся во вложенных контекстах, чтобы объединить несколько общих примеров, что увеличивает количество нагрузок. Думая об ускорении некоторых из этих тестов, я попытался уменьшить количество загрузок файлов, перемещая их за пределы блока before. как это

RSpec.describe MyClass do

  describe 'a function which sends a SOAP request'do
    the_file = File.read("spec/fixtures/somefile.xml")

    before do
      savon.mock!
      savon.expects(action).returns(the_file)
    end

    after { savon.unmock! }

    it 'checks something'
    it 'checks something else'
    it 'checks something more'
    it 'checks something different'
  end
end

Действительно, скорость не меняется; У меня есть блоки из 96 тестов с кратными, вложенными контекстами и проверками, и я не набрал даже 0,01 секунды. Итак, мои вопросы:

  • Я предполагал, что блок before загружает файл для каждого его право?
  • Есть ли в Rspec или Savon какой-нибудь кеш?
  • Как я могу отследить, сколько раз я действительно загружаю файл моего примера?

Спасибо!

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Возможно, вам следует изучить порядок зацепок и указать что-то, что подходит вам лучше, например before (:suite) или before (:context).В зависимости от того, что вы используете, будет выполнено

https://relishapp.com/rspec/rspec-core/docs/hooks/before-and-after-hooks

0 голосов
/ 28 мая 2019

Использование let let(:the_file) { File.read("spec/fixtures/somefile.xml") } решит вашу проблему, так как let lazy оценивается

...