2017-11-10 4 views
0

私は私のプロジェクトをテストするためにカピバラを使用しています。しかし、私は問題があります。 プロジェクトにリモートフォームがあります。彼らはajax経由でレコードを追加します。私がcapybaraでテストしているとき、開発環境でうまく動作します。それはページを訪問し、フォームに記入して提出する。 Booom、レコードが追加され、テストが失敗しました。 しかし、テスト環境でrspecを実行すると、不明な形式の例外が発生しています。Rails、Capybara - リモートリンクのクリックリンクは動作しません

1) add new address user adds new address 
Failure/Error: find("input[value='Adres Ekle']").click 

ActionController::UnknownFormat: 
    Account::AddressesController#create is missing a template for this request format and variant. 

    request.formats: ["text/html"] 
    request.variant: [] 
# ./spec/features/user_add_new_address_spec.rb:28:in `block (2 levels) in <top (required)>' 

また、次のようなコントローラからjsを介して応答しようとしました。

def create 
    request.format = :js 
end 

次に、

1) add new address user adds new address 
Failure/Error: find("input[value='Adres Ekle']").click 

ActionController::UnknownFormat: 
    Account::AddressesController#create is missing a template for this request format and variant. 

    request.formats: ["text/javascript"] 
    request.variant: [] 
# ./spec/features/user_add_new_address_spec.rb:28:in `block (2 levels) in <top (required)>' 

さらに詳しい情報が必要な場合は私のシナリオです。

scenario 'user adds new address' do 
    expect(page).to have_content 'Kayıtlı Adreslerim' 
    find("a[title='Adres Ekle']").click 
    expect(page).to have_content 'Yeni Adres Ekle' 
    expect(page).to have_content 'Adres Başlığı' 
    fill_in 'address[name]', with:'Izmir Ofisi' 
    select('Izmir', :from => 'address[city_id]') 
    fill_in 'address[address]', with: 'Lorem ipsum dolor sit amet.' 
    find("input[value='Adres Ekle']").click # It submits remote: true form. 
    expect(page).to have_content 'Success!' 
end 

PS:私の作成アクションは、そのようなものを表示しません。 そのような;

def create 
    @new_address = Address.new 
    @address = @current_account.addresses.new(address_params) 
    if @address.save 
     @check = true 
    else 
     @check = false 
    end 
end 

それはレンダリング:あなたのテストの設定は、あなたの問題を修正の上に、開発の設定をコピーして以来create.js.erb

<% if @check %> 
    if($('.addresses').length) { 
    $('.addresses').append('<%= j(render('account/addresses/address', address: @address)) %>'); 
    } 
    if($('#did-addresses').length){ 
     $('#did-addresses').append("<%= "<option selected='true' value='#{@address.id}'>#{@address.name}</option>".html_safe %>").selectpicker('refresh'); 
    } 
    $('#new-address').html('<%= j(render('account/addresses/form', new_address: @new_address)) %>'); 
    swal({ 
     type: 'success', 
     title: "<%= t('response.success') %>", 
     text: "<%= t('flash.actions.create.notice', resource_name: Address.model_name.human) %>", 
     timer: 2000 
    }); 
    quickview.close('#new-address'); 
<% else %> 
    <% @address.errors.each do |error| %> 

    <% end %> 
<% end %> 

$('.preloader').fadeOut(); 
+0

'jquery-ujs'(Railsの目立たないjavascriptドライバ)が動作していない場合、' remote:true'は普通のHTMLリクエストに戻ります。カピバラにはどのドライバーを使っていますか? – max

+0

IRB(メイン):001:0> Capybara.current_driver =>:rack_test IRB(メイン):002:0> Capybara.javascript_driver =>:セレン はまた、これらが正確開発およびテスト環境の両方で同じです。 –

+0

'シナリオ 'ユーザが新しいアドレス'、javascript:true do'を追加しようとしましたか?テストがラックテストで実行されている場合、ラックテストではjsが実行されないため、テストが説明されます。 – max

答えて

0

は、それはあなたのようなあなたのJSファイルのいずれかで、おそらくエラーが聞こえます。通常、テスト環境と本番環境では、すべてのJSアセットが1つのファイルに連結されます。そのため、いずれかのエラーが発生しても、他のコードが実行されない可能性があります。開発環境では、各JSファイルは個別にロードされます。つまり、ファイル内のエラーはそのファイル内の残りのコードにのみ影響します。問題のページに移動して修正するときは、ブラウザのコンソールでJSエラーを確認してください。

+0

'expect(page).not_to have_errors'でjsエラーをチェックするsmokescreenテストを作成することもできます。 – max

+1

@max IIRCこれは、capybara-webkitをドライバとして使用する場合にのみ動作します。 –

+0

私は今日試して、結果を知っています。どうもありがとう! –

関連する問題