2015-11-27 2 views
0

Я использую библиотеку javascript - clipboardjs - для копирования значений полей ввода в системный буфер обмена.как проверить javascript внутри rspec capybara?

В моем application.js:

function addressClipboard() { 
    new Clipboard('.address-copy', { 
     text: function(trigger) { 
      var addressString = ""; 
      addressString += $('#addresses_attributes_0_street').val() + "\n" + 
      $('#addresses_attributes_0_city').val() + "\n"; 
      addressString = addressString.trim(); 
      return addressString; 
     } 
    }) 
}; 

Я хотел проверить функциональность с RSpec & водосвинки.

address_spec.rb:

it "checks the copied values when clicking the copy-to-clipboard link", :js do 
     new_address = build(:address) 
     visit new_address_path 
     fill_in "person_addresses_attributes_0_street", with: new_address.street 
     fill_in "person_addresses_attributes_0_city", with: new_address.city 
     click_link(I18n.t('helpers.copy_to_clipboard')) 
     # Pseudocode: 
     expect(page.execute_script("addressClipboard()")).to eq([new.address.street,new.address.city].join) 

Есть ли способ, чтобы получить доступ к переменной JavaScript addressString и сравнить его с атрибутами адреса (например, new_address.street.) В пределах RSpec?

ответ

0

Я нашел решение:

После изменения моего JavaScript для:

addressClipboard = undefined; 
lastAddressString = undefined; 

$(document).ready(function(e) { 
    addressClipboard = new Clipboard('.address-copy', { 
     text: function(trigger) { 
      var addressString = ""; 
      addressString += $('#person_addresses_attributes_0_street').val() + "\n" + 
       $('#person_addresses_attributes_0_city').val() + "\n"; 
      lastAddressString = addressString = addressString.trim(); 
      return addressString; 
     }, 
    }); 
}); 

я могу получить доступ к lastAddressString в JavaScript в пределах RSpec:

clipboard_text = page.evaluate_script("addressClipboard.text()") 
    expected_text = [ new_address.street, new_address.city ].join("\n") 
    expect(clipboard_text).to eql(expected_text) 
0

Я думаю, что вы не смогли заполнить текстовое поле из-за использования fill_in, после чего он возвращает nill. Это должно быть fill_in 'Name', :with => 'text' см он должен вроде как:

it "checks the copied values when clicking the copy-to-clipboard link", :js do 
    new_address = build(:address) 
    visit new_address_path 
    fill_in "person_addresses_attributes_0_street", :with => new_address.street 
    fill_in "person_addresses_attributes_0_city", :with => new_address.city 
    click_link(I18n.t('helpers.copy_to_clipboard')) 

    expect(page.evaluate_script("addressClipboard()")).to be true 
end 
+0

мой метод fill_in работает. Я просто борюсь с доступом к переменной javascript. – StandardNerd

+0

@StandardNerd, если ваша функция определена в глобальной области действия, ваш вызов метода правильный, иначе вам нужно изучить область действия функции, а затем вызвать ее. Посмотрите на это: http://stackoverflow.com/a/9354233/2568849 –

Смежные вопросы