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 ...
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: 'user@example.com', password: 'password') end it "signs me in" do visit '/sessions/new' within("#session") do fill_in 'Email', with: 'user@example.com' 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('a@example.com') 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?')