RSpec. Part 3
-
Upload
vladimir-dementyev -
Category
Education
-
view
200 -
download
1
Transcript of RSpec. Part 3
http://www.thinknetica.com
RSpec & Friends 3: Acceptance Testing with
Capybara
1
http://www.thinknetica.com
Rack Session Access
# Gemfilegroup :test do gem 'rack-session-access'end
# config/environments/test.rbconfig.middleware.use RackSessionAccess::Middleware
2
http://www.thinknetica.com
Rack Session Access# spec/support/login_helper.rb
# Devise versiondef sign_in(user) page.set_rack_session(
'warden.user.user.key' => User.serialize_into_session(user).unshift("User")
)end
# Sorcery versiondef sign_in(user) page.set_rack_session(user_id: user.id)end
3
http://www.thinknetica.com
Multiple sessionsscenario "all users see new answer in real-time" do Capybara.using_session('author') do sign_in(user) visit question_path(question) end
Capybara.using_session('guest') do visit question_path(question) end
Capybara.using_session('author') do page.find("#add_answer_btn").trigger('click')
within "#new_answer_form" do fill_in 'Body', with: 'test text' click_on 'Save' end
expect(page).to have_content "Your answer has been successfully created" expect(page).to have_content "test text" end Capybara.using_session('guest') do expect(page).to have_content "test text" endend
4
http://www.thinknetica.com
Test server accessscenario "creates answer" do page.find("#add_answer_btn").trigger('click')
within "#new_answer_form" do fill_in 'Body', with: 'test text' click_on 'Save' end
visit_server
expect(page).to have_content "Your answer has been successfully created" expect(page).to have_content "test text"end
5
http://www.thinknetica.com
Test server access# spec/support/acceptance_helper.rb
def visit_server(user: nil, wait: 2, path: '/') url = "http://#{Capybara.server_host}:#{Capybara.server_port}" if user.present? url += "/dev/log_in/#{user.id}?redirect_to=#{path}" else url += path end
p "Visit server on: #{url}" Launchy.open(url) if wait == 0 p "Type any key to continue..." $stdin.gets p "Done." else sleep wait endend
6
http://www.thinknetica.com
Bonus #1
7
dev_log_in
https://github.com/divineforest/dev_log_in
http://www.thinknetica.com
Screenshot autosave
8
# spec/shared_context/shared_feature.rbshared_context "feature", type: :feature do after(:each) do |example| next unless example.exception meta = example.metadata next unless meta[:js] == true filename = File.basename(meta[:file_path]) line_number = meta[:line_number] screenshot_name = "screenshot-#{filename}-#{line_number}.png" save_screenshot(screenshot_name) # rubocop:disable Lint/Debugger puts meta[:full_description] + "\n Screenshot: #{screenshot_name}" endend
http://www.thinknetica.com
Multiple hosts testing
9
# spec/acceptance_helper.rbCapybara.server_host = "0.0.0.0"Capybara.server_port = 3001Capybara.always_include_port = true
config.before(:each, type: :feature) do Capybara.app_host = "http://#{Capybara.server_host}.xip.io"end
http://www.thinknetica.com
Multiple hosts testing
10
# spec/support/acceptance_helper.rbdef switch_subdomain(name = "dev") host = "#{name}.#{Capybara.server_host}.xip.io" Capybara.app_host = "http://#{host}"end
def switch_hostname(host) Capybara.app_host = "http://#{host}"end
http://www.thinknetica.com
Bonus #2
11
http://xip.io
http://nip.io
http://www.thinknetica.com
Background Processes
12
# spec/bg_helper.rbhive_pid = nil
puts "Starting background processes..."rout, wout = IO.pipehive_pid = Process.spawn('hivemind Procfile.spec', out: wout)
Timeout.timeout(10) do loop do output = rout.readline break if output =~ /Listening on tcp:\/\/localhost\:9292/ endend
puts "Background processes have been started."
at_exit do puts "Stopping background processes..." Process.kill 'INT', hive_pid Process.wait hive_pid puts "Background processes have been stopped."end
http://www.thinknetica.com
Background Processes
13
# Procfile.specpp: bundle exec rackup private_pub.ru -s puma -E production
# spec/acceptance/some_spec.rbrequire 'bg_helper' unless Nenv.skip_bg?
# when background is already runningSKIP_BG=1 bundle exec spec
http://www.thinknetica.com
Bonus #3
14
hivemind https://github.com/DarthSim/hivemind
nenv https://github.com/e2/nenv