Рельсы - Minitest + Capybara + Selenium - Тестовое уничтожающее действие - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в Minitest / Capybara / Selenium. Но я хочу протестировать свое действие уничтожения контроллера. Я пытаюсь сделать следующее, и это не удается

test "destroy" do
  companies_count = Company.count
  visit company_path(@company)
  click_on "Delete"
  page.driver.browser.switch_to.alert.accept
  assert_equal (companies_count - 1), Company.count
end

ВЫХОД:

    test_destroy                                                    FAIL (2.17s)
    Expected: 6
      Actual: 7

Пробовал и этот способ.

test "destroy" do
    assert_difference('Company.count', -1) do
      delete company_url(@company)
    end
end

ВЫХОД:

Minitest::UnexpectedError:         NoMethodError: undefined method `delete' for #<CompaniesControllerTest:0x000056171e550038>

Может ли кто-нибудь помочь мне в тестировании моего действия уничтожения?

Ответы [ 2 ]

1 голос
/ 10 июля 2020
• 1000 ваши тесты и ваше приложение, предотвращая проблему того, что тесты не могут видеть изменения ваших приложений.

Также, если вы используете Selenium в этих системных тестах, основная проблема, с которой вы имеете дело, заключается в том, что действия в браузере происходят асинхронно из ваших тестов, поэтому только то, что вы сказали вашему тесту принять диалоговое окно, не означает, что действие по удалению компании завершено, когда оно вернется. Способ проверить это - просто немного поспать перед проверкой изменений в count. Хотя это сработает, это не лучшее окончательное решение, потому что оно приводит к потере времени. Вместо этого вы должны проверять визуальное изменение, указывающее, что действие завершено, прежде чем проверять новый счетчик

test "destroy" do
  companies_count = Company.count
  visit company_path(@company)
  accept_confirm do      
    click_on "Delete"
  end

  assert_text "Company Deleted!" # Check for whatever text is shown to indicate the action has successfully completed

  assert_equal (companies_count - 1), Company.count
end

Это работает, потому что предоставленные Capybara утверждения имеют поведение ожидания / повторной попытки, которое позволяет приложению до указанного c количество времени, чтобы догнать то, что ожидает тест.

Примечание: я заменил page.driver... на правильное использование модального API системы Capybaras - если вы используете page.driver... обычно это указывает на то, что вы делаете что-то не так.

1 голос
/ 10 июля 2020

Это очень вероятно, потому что то, что вы выполняете непосредственно в своем тесте, происходит в транзакции, и ваш веб-драйвер запускает действия, которые происходят в другом. Вы можете узнать больше о том, как это происходит здесь: https://edgeguides.rubyonrails.org/testing.html#testing -parallel-transaction

Вот аналогичная проблема: Тест интеграции Rails с использованием селена в качестве веб-драйвера - не удается подписать_в

И, как указано в руководствах Rails и аналогичном вопросе, вам, вероятно, придется использовать решение вроде http://rubygems.org/gems/database_cleaner

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

...