Тесты Rspec проходят при индивидуальном запуске, но терпят неудачу при выполнении всех вместе

В проекте используется MongoDB, поэтому эти ответы бесполезны: 1, 2, 3

Я могу успешно выполнить каждый тестовый файл или даже небольшие группы тестовых файлов, но они терпят неудачу при запуске всех вместе. rspec spec/*

Finished in 23 minutes 45 seconds (files took 23.02 seconds to load)
2071 examples, 1357 failures, 28 pending

Проект немного устарел. MongoDB 3.6, Ruby 2.5.1 с Padrino в качестве фреймворка. Кроме того, мы используем DatabaseCleaner и Fabrication. Многие ошибки показывают классическое сообщение Sinatra doesn’t know this ditty.

61) BlogController POST :create Microsite request should return code 12 for invalid token
      Failure/Error: @response_body = JSON.parse(last_response.body)

      JSON::ParserError:
        784: unexpected token at '<!DOCTYPE html>
        <html>
        <head>
          <style type="text/css">
          body { text-align:center;font-family:helvetica,arial;font-size:22px;
            color:#888;margin:20px}
          #c {margin:0 auto;width:500px;text-align:left}
          </style>
        </head>
        <body>
          <h2>Sinatra doesn’t know this ditty.</h2>
          <img src='http://localhost.la/__sinatra__/404.png'>
          <div id="c">
            Try this:
            <pre># in app.rb
        class Microsite
          post &#x27;&#x2F;v1&#x2F;microsite&#x2F;blog&#x27; do
            &quot;Hello World&quot;
          end
        end
        </pre>
          </div>
        </body>
        </html>
        '

Кроме того, мой босс использует Apple, и у него была аналогичная проблема, связанная с WiredTiger. Однако я использую Ubuntu, и файл журнала MongoDB не показывает ошибок WiredTiger при выполнении тестов. Вроде поправил с настройкой системы. Очевидно, Rspec пытался открыть все файлы, чтобы выполнить тесты, и процессу не хватило памяти или что-то в этом роде. Должен ли я сделать аналогичную конфигурацию в Ubuntu?

config.ru

spec/spec_helper.rb


person John David Barbosa    schedule 16.02.2021    source источник
comment
Кажется, что маршрут, на который тест пытается отправить запрос POST, не существует, поэтому он показывает страницу Sinatra 404, отображаемую как HTML, вместо возврата полезной нагрузки JSON. Вы следовали совету, который появляется в этой ошибке?   -  person gd_silva    schedule 16.02.2021
comment
Это не имеет ничего общего с MongoDB. Сделайте копию своего проекта, удалите все ссылки на базу данных, снова запустите тесты и обновите вопрос с выводами.   -  person D. SM    schedule 16.02.2021
comment
@gd_silva Как я уже упоминал, я могу выполнить этот конкретный тестовый файл по отдельности, чем он пройдет, проблема заключается в том, чтобы запустить все тестовые файлы вместе.   -  person John David Barbosa    schedule 16.02.2021
comment
@D.SM Извините, я не понимаю, что вы имеете в виду.   -  person John David Barbosa    schedule 16.02.2021


Ответы (1)


Когда тест A проходит изолированно, но не во всем наборе тестов, это обычно означает, что предыдущий тест B изменяет состояние тестовой среды (например, не очищает базу данных или что-то подобное), так что тест B не проходит.

Что вам нужно сделать, так это найти этот тест B, который изменяет состояние тестовой среды, а затем провести рефакторинг этого теста, чтобы он вернулся в чистое состояние.

Я обычно делаю это, запуская тест A изолированно, а затем просматриваю структуру папок до тех пор, пока тест A не завершится неудачей, а затем смотрю, какие тесты выполнялись раньше.

Я посмотрел на ваш spec_helper.rb и увидел, что вы выполняете свои спецификации в порядке. После того, как вы исправите эту проблему, я бы порекомендовал вам запускать их в случайном порядке. Это поможет вам избежать зависимостей между тестами. Ознакомьтесь с документацией Rspec подробности.

Добавьте этот конфиг в свой spec_helper.rb

RSpec.configure do |config|
  # other config

  config.order = "random"
  Kernel.srand config.seed
  
  # more config
end

Я также рекомендую вам проверить response.status и response.header['content-type'], прежде чем анализировать response.body с JSON.parse(last_response.body).

person Thomas Koppensteiner    schedule 18.02.2021