rspec. part 3

14
http://www.thinknetica.com RSpec & Friends 3: Acceptance Testing with Capybara 1

Upload: vladimir-dementyev

Post on 22-Jan-2018

200 views

Category:

Education


1 download

TRANSCRIPT

Page 1: RSpec. Part 3

http://www.thinknetica.com

RSpec & Friends 3: Acceptance Testing with

Capybara

1

Page 2: RSpec. Part 3

http://www.thinknetica.com

Rack Session Access

# Gemfilegroup :test do gem 'rack-session-access'end

# config/environments/test.rbconfig.middleware.use RackSessionAccess::Middleware

2

Page 3: RSpec. Part 3

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

Page 4: RSpec. Part 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

Page 5: RSpec. Part 3

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

Page 6: RSpec. Part 3

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

Page 7: RSpec. Part 3

http://www.thinknetica.com

Bonus #1

7

dev_log_in

https://github.com/divineforest/dev_log_in

Page 8: RSpec. Part 3

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

Page 9: RSpec. Part 3

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

Page 10: RSpec. Part 3

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

Page 11: RSpec. Part 3

http://www.thinknetica.com

Bonus #2

11

http://xip.io

http://nip.io

Page 12: RSpec. Part 3

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

Page 13: RSpec. Part 3

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

Page 14: RSpec. Part 3

http://www.thinknetica.com

Bonus #3

14

hivemind https://github.com/DarthSim/hivemind

nenv https://github.com/e2/nenv