Page Objects могут быть использованы как мощный метод абстракции (изоляции) ваших тестов от технической реализации. Важно помнить, их (Page Objects) можно использовать для увеличения стабильности тестов и поддержания принципа DRY (do not repeat yourself) — посредством инкапсуляции функционала (вебсайта) в простых методах.
require 'feature_helper'
feature 'Blog management', type: :feature do
scenario 'Successfully creating a new blog' do
visit '/'
click_on 'Form Examples'
expect(page).to have_content('Create Blog')
fill_in 'blog_title', with: 'My Blog Title'
fill_in 'blog_text', with: 'My new blog text'
click_on 'Save Blog'
expect(page).to have_selector('.blog--show')
expect(page).to have_content('My Blog Title')
expect(page).to have_content('My new blog text')
end
scenario 'Entering no data' do
visit '/'
click_on 'Form Examples'
expect(page).to have_content('Create Blog')
click_on 'Save Blog'
expect(page).to have_content('4 errors stopped this form being submitted')
expect(page).to have_content("Title can't be blank")
expect(page).to have_content("Text can't be blank")
expect(page).to have_content('Title is too short')
expect(page).to have_content('Text is too short')
end
end
require 'feature_helper'
require_relative '../pages/new_blog'
require_relative '../pages/view_blog'
feature 'Blog management', type: :feature do
let(:new_blog_page) { ::Pages::NewBlog.new }
let(:view_blog_page) { ::Pages::ViewBlog.new }
before :each do
new_blog_page.visit_location
end
scenario 'Successfully creating a new blog' do
new_blog_page.create title: 'My Blog Title',
text: 'My new blog text'
expect(view_blog_page).to have_loaded
expect(view_blog_page).to have_blog title: 'My Blog Title',
text: 'My new blog text'
end
scenario 'Entering no data' do
new_blog_page.create title: '',
text: ''
expect(view_blog_page).to_not have_loaded
expect(new_blog_page).to have_errors "Title can't be blank",
"Text can't be blank",
"Title is too short",
"Text is too short"
end
end
module Pages
class NewBlog
include RSpec::Matchers
include Capybara::DSL
# ...
end
end
has_css? '.foo'
has_content? 'hello world'
find('.foo').click
include RSpec :: Matchersв приведенных выше примерах, чтобы использовать RSpec библиотеку expectation.
expect(self).to have_content 'foo'
expect(page_object.content).to match 'foo'
def visit_location
visit '/blogs/new'
# It can be beneficial to assert something positive about the page
# before progressing with your tests at this point
#
# This can be useful to ensures that the page has loaded successfully, and any
# asynchronous JavaScript has been loaded and retrieved etc.
#
# This is required to avoid potential race conditions.
expect(self).to have_loaded
end
def has_loaded?
self.has_selector? 'h1', text: 'Create Blog'
end
def create(title:, text:)
# ...
end
def has_errors?(*errors)
# ...
end
def has_error?(error)
# ...
end
# ...
def create(title:, text:)
blog_form.new.create title: title,
text: text
end
# ...
private
def blog_form
::Components::BlogForm
end
module Components
class BlogForm
include RSpec::Matchers
include Capybara::DSL
def create(title:, text:)
within blog_form do
fill_in 'blog_title', with: title
fill_in 'blog_text', with: text
click_on 'Save Blog'
end
end
private
def blog_form
find('.blog--new')
end
end
end
require 'feature_helper'
require_relative '../pages/new_blog'
require_relative '../pages/view_blog'
feature 'Blog management', type: :feature do
let(:new_blog_page) { ::Pages::NewBlog.new }
let(:view_blog_page) { ::Pages::ViewBlog.new }
# ...
end
scenario 'Successfully creating a new blog' do
new_blog_page.create title: 'My Blog Title',
text: 'My new blog text'
expect(view_blog_page).to have_loaded
expect(view_blog_page).to have_blog title: 'My Blog Title',
text: 'My new blog text'
end
expect(view_blog_page).to have_loaded
expect(view_blog_page).to have_blog title: 'My Blog Title',
text: 'My new blog text'
def has_loaded?
# ...
end
def has_blog?(title:, text:)
# ...
end
К сожалению, не доступен сервер mySQL