Sử dụng Capybara để test ứng dụng

Chúng ta hầu như đều rất quen thuộc với Rspec-một công cụ viết test trên ứng dụng Ruby on Rails.Rspec là 1 công cụ rất mạnh hỗ trợ chúng ta test độ chính xác của logic code của mình tạo ra.Với rspec ta có thể dùng để kiểm nghiệm độ chính xác của function mình viết ra, thế nhưng đối với sự hoạt động của sản phẩm trên từng yêu cầu cụ thể cũng chưa chắc chính xác so với những gì người lập trình mong muốn.Capybara là công cụ giúp chúng ta có thể giải quyết vấn đề này.

CÀI ĐẶT

Capybara yêu cầu Ruby 1.9.3 trở lên, để cài đặt, chúng ta có thể add dọng sau vào Gemfile va chạy bundle install

gem 'capybara'

sau đó thêm dòng sau vào rspec_helper.rb:

require 'capybara/rails'

Sử dụng với Rpsec

chúng ta tạo thư mục spec/features , Capybara specs code sẽ được viết ở trong này(nếu sử dụng config như sau: config).Hoặc nếu files specs nằm ở thư mục khác thì cần phải có cài đặt sau: :type => :feature

Ví dụ:

describe "the signin process", :type => :feature do
 before :each do
   User.make(email: '[email protected]', password: 'password')
 end

 it "signs me in" do
   visit '/sessions/new'
   within("#session") do
     fill_in 'Email', with: '[email protected]'
     fill_in 'Password', with: 'password'
   end
   click_button 'Sign in'
   expect(page).to have_content 'Success'
 end
end

Sử dụng js: true để thay đổi tới Capybara.javascript_driver, hoặc cũng cấp thông tin :driver để xác định chuyển đến 1 drive nhất định:

describe 'some stuff which requires js', js: true do
  it 'will use the default js driver'
  it 'will switch to one specific driver', :driver => :webkit
end

Điều hướng

Ta dùng method visit để truy cập 1 trang nhất định, ví dụ:

visit('/projects')
visit(post_comments_path(post))

visit method chỉ nhận duy nhất 1 parameter, request method luôn luôn là dạng GET.

chúng ta có thể kiểm tra dường dẫn hiện thời của trang truy cập như sau:

expect(page).to have_current_path(post_comments_path(post))

CLick link và button

Bạn có thể tương tác với webapp bằng cách click vào liên kết và nút. Capybara tự động theo dõi bất kỳ chuyển hướng nào và submit form liên kết với các nút.

click_link('id-of-link')
click_link('Link Text')
click_button('Save')
click_on('Link Text') # clicks on either links or buttons
click_on('Button Value')

Tương tác với form

chúng ta có nhiều công cụ để có thể thực hiện các action liên quan tới form như sau:

  • Điền form với fill_in:
fill_in('First Name', with: 'John')
fill_in('Password', with: 'Seekrit')
fill_in('Description', with: 'Really Long Text...')
  • lựa chọn radio button hoặc checkbox:
choose('A Radio Button')
check('A Checkbox')
uncheck('A Checkbox')
  • upload image:
attach_file('Image', '/path/to/image.jpg')
  • chọn option trong select box:
select('Option', from: 'Select Box')

Querying

chúng ta có nhiều công cụ để kiểm tra các phần tử của trang như sau:

page.has_selector?('table tr')
page.has_selector?(:xpath, './/table/tr')

page.has_xpath?('.//table/tr')
page.has_css?('table tr.foo')
page.has_content?('foo')

dùng với Rspec:

expect(page).to have_selector('table tr')
expect(page).to have_selector(:xpath, './/table/tr')

expect(page).to have_xpath('.//table/tr')
expect(page).to have_css('table tr.foo')
expect(page).to have_content('foo')

Tìm kiếm

Ta có thể tìm kiếm các phần tử của trang như sau:

find_field('First Name').value
find_field(id: 'my_field').value
find_link('Hello', :visible => :all).visible?
find_link(class: ['some_class', 'some_other_class'], :visible => :all).visible?

find_button('Send').click
find_button(value: '1234').click

find(:xpath, ".//table/tr").click
find("#overlay").find("h1").click
all('a').each { |a| a[:href] }

Đây là cách khác với việc sử dụng block:

find_field('First Name'){ |el| el['data-xyz'] == '123' }
find("#img_loading"){ |img| img['complete'] == true }

Scoping

Capybara cho phép chúng ta giới hạn những hành động nhất định, ví dụ nhưu tương tác với các form hoặc click vào các link hay button ở trong một vùng cụ thể của trang web. Để làm được điều này, bạn sử dụng hàm within.Bạn có thể tùy chọn các selector khác nhau để sử dụng, ví dụ như sau:

within("li#employee") do
  fill_in 'Name', with: 'Jimmy'
end

within(:xpath, ".//li[@id='employee']") do
  fill_in 'Name', with: 'Jimmy'
end

Ngoài ra còn có một số hàm khác dành cho các fieldset hoặc table, định danh bởi id hoặc đoạn text của fieldset hay table đó:

within_fieldset('Employee') do
  fill_in 'Name', with: 'Jimmy'
end

within_table('Employee') do
  fill_in 'Name', with: 'Jimmy'
end

Làm việc với cửa sổ

chúng ta có thể phát hiện sự chuyển cửa sổ như sau:

facebook_window = window_opened_by do
  click_button 'Like'
end
within_window facebook_window do
  find('#login_email').set('[email protected]')
  find('#login_password').set('qwerty')
  click_button 'Submit'
end

Test script

ta có thể chạy lệnh script như sau:

page.execute_script("$('body').empty()")
result = page.evaluate_script('4 + 4');

Modal

chúng ta có thể chấp nhận hoặc bỏ qua alert bằng cách sau:

accept_alert do
  click_link('Show Alert')
end

Tương tự với confirm và prompt:

dismiss_confirm do
  click_link('Show Confirm')
end
accept_prompt(with: 'Linus Torvalds') do
  click_link('Show Prompt About Linux')
end

và chúng ta có thể kiểm tra message trả về như sau:


message = accept_prompt(with: 'Linus Torvalds') do
  click_link('Show Prompt About Linux')
end
expect(message).to eq('Who is the chief architect of Linux?')