2

次のテストは、初めて ( の後rake db:test:prepare) 合格しましたが、失敗して以降の実行でエラーが発生しました。

Capybara::ElementNotFound: css "#sale_payment_btn" が見つかりません

require "test_helper"

DatabaseCleaner.strategy = :transaction

class SaleFeatureTest < Capybara::Rails::TestCase
  include Warden::Test::Helpers
  Warden.test_mode!

  self.use_transactional_fixtures = false

  setup do
    login_as users(:admin), scope: :user
    Capybara.current_driver = :selenium #:webkit
    DatabaseCleaner.start
  end

  teardown do
    DatabaseCleaner.clean
    Warden.test_reset!
  end

  test "Sale" do        
    visit(new_sale_path) # create new sale and redirect to it
    assert page.has_css?('#sale_payment_btn') # gave error at second time
    find(:css, '#sale_payment_btn').click # this create payment
  end

クロムでセレンを使用したので、販売のIDを見ることができました。後続のテストでも ID が同じであることに気付きました。すなわち980190963

私の理論はそれです

  1. database_cleaner期待どおりに機能していません。(ファイルに DB クリーニング sql コマンドが表示されtest.logますが、データがデータベースに残っていることがわかりました)

  2. visitレンダリングされていないため(最初の実行でセールがすでに行われているため)、新しい作成はしません(ここで@sale述べたように、ミニテストを使用します)。#sal_payment_btnpayment

私は今、半日髪を引っ張っています。私が試してみました

  • webkit運転者
  • 異なるクリーニング戦略truncationdeletion

2回目の実行ではまだテストに合格できません。手動テストでは問題なく動作しています。

私は何をどこで間​​違えましたか?

PS私は次の宝石を使用しています

minitest-rails-capybara
selenium-webdriver
chromedriver-helper
database_cleaner
minitest-around
pg

私は以下を読みました

4

1 に答える 1

3

のセットアップに問題があることを確認しましたdatabase_cleaner

短縮版

:transaction私のセットアップでは戦略が機能しませんでしたcucumber+ webkit/ selenium. :deletion作戦に変更。

私が学んだこと

勉強不足だったようです。答えを探しているうちに、次のことがわかりました。

  1. データベース クリーナー トランザクション戦略が Cucumber と Selenium で機能しないのはなぜですか? - 無回答

  2. Cucumber と RSpec を使用して Rails の database_cleaner をセットアップする方法は、次のように述べています。

    この:transaction戦略は Selenium では機能しません

  3. database_cleanerreadmeは、:transaction戦略がもう少し作業を課すと述べました

    ただし、テストで複数のデータベース接続を使用する必要が生じた場合 (つまり、テストがアプリケーションとは異なるプロセスで実行される場合)、この戦略を使用することは少し難しくなります。

その他の価値ある読み物

于 2015-06-21T12:23:38.550 に答える