RSpec. Part 3

Preview:

Citation preview

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