2016-08-24 12 views
0

私は次のテストを作成しようとしています: モデルを編集して、ビューが更新されているかどうか、モデルがデータベースで変更されているかどうかを確認します。テスト途中でティアダウンが呼び出されました

コードがあります:あなたは私が基準を再ロードテストの最後に見ることができるように

teardown do 
    DatabaseCleaner.clean 
    ActiveRecord::Base.connection.close 
    Capybara.reset_sessions! 
end 

test 'a' do 
    user = User.joins(:organization_users).find_by organization_users: { role: OrganizationUser.roles.values_at(:ORGANIZER, :ADMINISTRATOR) } 

    sign_in_user user 

    criterion = create(:criterion, scoring_id: @scoring.id, name: "Test criterion name", 
         description: "Test description") 
    step = create(:step, criterion_id: criterion.id) 

    visit "scorings/" + (@scoring.id).to_s + "/criteria" 

    find("#criteria > div > div > a > i").click() 

    fill_in 'name', with: 'New name' 
    fill_in 'description', with: 'New description' 

    find('#criterion-modal > div:nth-child(2) > form > div:nth-child(4) > input').click() 

    criterion = criterion.reload 

    assert criterion.name == 'New name' 

    end 

` ドライバ:

Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new app , { phantomjs: Phantomjs.path } 
end 
Capybara.javascript_driver = :poltergeist 
Capybara.current_driver = Capybara.javascript_driver 

ティアダウンは、しかし、私がそうすると、ティアダウン機能が呼び出されます。その後、データベースが消去され、「cant find criterion id:1」というエラーが表示されます。私はminitest、工場の女の子とCapybaraを使用しています。だから私が理解したいのは、テストの終わりではなく、なぜそれを修正できるのかという理由でティアダウンが呼ばれた理由です。

ありがとうございます。

答えて

0

あなたのティアダウン方法の設定は表示されません。また、カピバラで使用するドライバを指定することもできません。ただし、テストコードとティアダウンは同じスレッドで実行されるため、テストが終了する前にティアダウンを実行する方法はありません。可能なことは(クリックが非同期に処理されるJS対応のドライバを使用する場合)、クリックがアプリケーションコードによって処理/処理される前にティアダウンが実行されることです。これは、 "cant find criterion id:1"がコントローラコードから実際に来ることを意味します。その理由は、クリックした後に変更するページ上のものを実際にチェックしていないため、テストが動くだけで、アサーションが終了し、ティアダウンがきれいになり、コントローラアクションがレコードを見つけることができないからです。 click後、サイドノートで、あなたのreload

assert_text 'Criterion updated' # if a message is displayed on successful update 

または

assert_current_path("scorings/#{@scoring.id}") # whatever path it redirects to after updating 

ような何か - 「#基準モーダル> divのような長いセレクタの使用:n番目の子を(2 )> form> div:nth-​​child(4)> input 'は本当に壊れやすいテストにつながります - できるだけ単純なセレクタやcapybara click_buttonタイプのヘルパーを使う方がはるかに良いでしょう

+0

ありがとうまたはあなたのアドバイス、私は自分の投稿を編集し、あなたが言っていなかったことを追加しました。私は何かを理解していない、ティアダウンは私のテストの終わりが終わる前に呼び出されています、私はいくつかのデバッグメッセージでそれを確認した。私は今私のページで何かをチェックしています。更新リクエストは、送信後、実際にビューが更新されたかどうかを確認するAjaxの1つです。しかし、私がリロードすると、同じエラーがポップし続けます。ここで本当にしたいのは、ビューが更新されたかどうか、および基準オブジェクトがデータベースで更新されたかどうかだけです。 – TyLO

+0

@TyLO注文を検証していると思われるデバッグメッセージはどこに記入しましたか?テストコードが完了する前にティアダウンを実行することはできません(パラレルテストを実行していて、その設定に問題がない限り)。あなたのティアダウンでは、 'DatabaseCleaner.clean'を呼び出す前に' Capybara.reset_sessions! 'を呼び出す必要があり、接続を閉じる必要はありません。それでも問題が解決しない場合は、ページに何かをチェックしてテストに追加するコマンドを追加して、デバッグメッセージの場所と実際の出力を追加してください。 –

関連する問題