Browse Source

Improves wait time when writing test you expect to fail

- reduces default wait time from 60 seconds to 2 seconds
- makes use of Capybara's built in polling negative matchers to increase test stability
- adds a helper method to take a screenshot and open it to help understand what's happening in a test
Will Read 9 years ago
parent
commit
771afe9cdf

+ 2 - 1
Gemfile

@@ -142,9 +142,10 @@ group :development do
 
   group :test do
     gem 'coveralls', require: false
+    gem 'capybara-select2', require: false
     gem 'delorean'
+    gem 'launchy', require: false
     gem 'poltergeist'
-    gem 'capybara-select2', require: false
     gem 'pry-rails'
     gem 'rr'
     gem 'rspec', '~> 3.2'

+ 1 - 0
Gemfile.lock

@@ -627,6 +627,7 @@ DEPENDENCIES
   jsonpath (~> 0.5.6)
   kaminari (~> 0.16.1)
   kramdown (~> 1.3.3)
+  launchy
   letter_opener_web
   liquid (~> 3.0.3)
   listen (~> 3.0.5)

+ 4 - 2
spec/capybara_helper.rb

@@ -2,16 +2,18 @@ require 'rails_helper'
 require 'capybara/rails'
 require 'capybara/poltergeist'
 require 'capybara-select2'
+require 'helpers/capybara_poltergeist_screenshot'
 
 Capybara.register_driver :poltergeist do |app|
-  Capybara::Poltergeist::Driver.new(app, timeout: 60)
+  Capybara::Poltergeist::Driver.new(app, timeout: 2)
 end
 
 Capybara.javascript_driver = :poltergeist
-Capybara.default_max_wait_time = 60
+Capybara.default_max_wait_time = 2
 
 RSpec.configure do |config|
   config.include Warden::Test::Helpers
+  config.include Capybara::PoltergeistScreenshot
   config.before :suite do
     Warden.test_mode!
   end

+ 4 - 4
spec/features/admin_users_spec.rb

@@ -22,7 +22,7 @@ describe Admin::UsersController do
       visit admin_users_path
       find(:css, "a[href='/admin/users/#{users(:bob).id}']").click
       expect(page).to have_text("User 'bob' was deleted.")
-      expect(page).not_to have_text('bob@example.com')
+      expect(page).to have_no_text('bob@example.com')
     end
 
     context "creating new users" do
@@ -82,12 +82,12 @@ describe Admin::UsersController do
     context "(de)activating users" do
       it "does not show deactivation buttons for the current user" do
         visit admin_users_path
-        expect(page).not_to have_css("a[href='/admin/users/#{users(:jane).id}/deactivate']")
+        expect(page).to have_no_css("a[href='/admin/users/#{users(:jane).id}/deactivate']")
       end
 
       it "deactivates an existing user" do
         visit admin_users_path
-        expect(page).not_to have_text('inactive')
+        expect(page).to have_no_text('inactive')
         find(:css, "a[href='/admin/users/#{users(:bob).id}/deactivate']").click
         expect(page).to have_text('inactive')
         users(:bob).reload
@@ -98,7 +98,7 @@ describe Admin::UsersController do
         users(:bob).deactivate!
         visit admin_users_path
         find(:css, "a[href='/admin/users/#{users(:bob).id}/activate']").click
-        expect(page).not_to have_text('inactive')
+        expect(page).to have_no_text('inactive')
         users(:bob).reload
         expect(users(:bob)).to be_active
       end

+ 1 - 1
spec/features/create_an_agent_spec.rb

@@ -13,4 +13,4 @@ describe "Creating a new agent", js: true do
 
     expect(page).to have_text("Test Trigger Agent")
   end
-end
+end

+ 12 - 0
spec/helpers/capybara_poltergeist_screenshot.rb

@@ -0,0 +1,12 @@
+require 'launchy'
+
+module Capybara
+  module PoltergeistScreenshot
+    def screenshot_and_open_image(full: false)
+      timestamp = Time.now.strftime('%Y-%m-%d-%H-%M-%S')
+      screenshot_path = "tmp/capybara/screenshot_#{timestamp}_#{SecureRandom.hex}.png"
+      page.save_screenshot(screenshot_path, full: full)
+      Launchy.open screenshot_path
+    end
+  end
+end