Тесты Rails дают сбой при запуске в виде набора, но проходят при индивидуальном запуске и также передают CI - PullRequest
0 голосов
/ 31 октября 2019

Я использую minitest в Rails 5.2 с Factorybot.

Когда я запускаю тесты по отдельности (например, models / extended_object_test.rb), они проходят, но когда я запускаю весь набор, «кажущиеся» не связанные тесты начинаютпотерпите неудачу в «по-видимому» несвязанных методах.

Есть несколько похожих вопросов по SO, но они не помогли. Я пытался использовать DatabaseCleaner между каждым тестом, но у меня та же проблема.

Я подозреваю, что моя проблема связана с тем, как я использую фабрики, но я теряюсь в том, как отлаживать.

ошибка, которую я получаю, всегда относится к методу import_colms_images_to_s3, например:

error relating to tests/models/info_test_page.rb

test_metadata                                                   FAIL (0.43s)
        not all expectations were satisfied
        unsatisfied expectations:
        - expected exactly once, invoked twice: #<EnhancedObject:0x55652b343e20>.import_colms_images_to_s3(any_parameters)
        - expected exactly once, invoked twice: #<EnhancedObject:0x556527763e28>.import_colms_images_to_s3(any_parameters)
        - expected exactly once, invoked twice: #<EnhancedObject:0x5565289bb170>.import_colms_images_to_s3(any_parameters)

Единственное место, которое я ожидаю, касающееся import_colms_images_to_s3, - это 3 теста с тестом модели extended_object, например:

tests/models/enhanced_object_test.rb

## Stubbed the import_colms_images_to_s3 method to avoid the db call to museum_object

test "create enhanced object success" do
    eo = EnhancedObject.new
    eo.name = "test"
    eo.short_description = "shrt dscrptn"
    eo.long_description = "Loooong description"
    eo.museum_unique_id = "O70135"
    eo.colms_images = ["2006ar9715"]
    eo.expects(:import_colms_images_to_s3).returns(true)
    assert eo.save, "Saved enhanced object"
  end

тест для модели info_test_page:

require 'test_helper'

class InfoPageTest < ActiveSupport::TestCase

  setup do
    @infopage = create(:info_page)
  end

 test "metadata" do
    assert @infopage.metadata.present?
    assert_equal(@infopage.title, @infopage.metadata[:title])
  end
end

В этом тесте используется фабрика info_page, но, опять-таки, он не имеет связи с extended_objects и ошибочным методом.

test/factories/info_pages.rb

FactoryBot.define do
  factory :info_page do
    sequence(:title) { |n| "Info page #{n}" }
    sequence(:slug) { |n| "info-page-#{n}" }
    body { '{"data":[{"type":"heading","data":{"text":"Test info page",'\
         '"format":"html"}},{"type":"text","data":{"text":'\
         '"<p>This is some <b>body</b> text...</p>",'\
         '"format":"html"}},{"type":"quote","data":{"text":'\
         '"<p>This is a quote</p>", "format":"html",'\
         '"cite":"By someone useful."}}]}' }
    background_image {
      fixture_file_upload(
        Rails.root.join('test', 'fixtures', 'header.jpg'),
        'image/jpg') }
    background_image_credit { 'Kermit T. Frog' }
    colour_scheme { ColourScheme::COLOUR_SCHEMES.first }
  end

  trait :without_image do
    background_image { nil }
  end
end

Насколько мне известно, информационные страницы и расширенные объекты не связаны между собой, поэтому я не могу понять, почему тесты каким-то образом взаимодействуют.

Окончательное указание на то, что при запуске набора тестов на Circle CI тестыпройти при запуске как набор.

...