mirror of
https://github.com/thoughtbot/shoulda-matchers.git
synced 2022-11-09 12:01:38 -05:00
12543ede2e
Given this scenario: * Using Rails 4.1 * Gemfile has `gem 'shoulda-matchers', require: false` * spec_helper has `require 'shoulda/matchers'` following `require 'rspec/rails'` * Using Spring to run tests matchers that delegate to assertions in Rails (e.g. `render_template` and `route`) will fail in the wrong way if used. They fail because in order to use these assertions, we expect that the assertions will raise a specific exception, an exception that corresponds to whichever test framework that Rails is using. For Rails versions that used Test::Unit, this is Test::Unit::AssertionFailedError. For current Rails versions, which now use Minitest, this exception is Minitest::Assertion. The problem is that instead of asking Rails which exception class it's using, we are trying to detect this exception class ourselves (for cases in which Rails is not being used). This leads to the wrong class being detected: when using a Rails version that uses Minitest, we choose Test::Unit::AssertionFailedError as the class. This happens using the exact scenario above because even though shoulda-matchers is loaded after rspec-rails, rspec-rails itself defines Test::Unit::AssertionFailedError. Also add Cucumber tests that confirms this exact scenario works.
27 lines
836 B
Ruby
27 lines
836 B
Ruby
module Shoulda
|
|
module Matchers
|
|
if defined?(ActiveSupport::TestCase)
|
|
# @private
|
|
AssertionError = ActiveSupport::TestCase::Assertion
|
|
elsif Gem.ruby_version >= Gem::Version.new('1.8') && Gem.ruby_version < Gem::Version.new('1.9')
|
|
require 'test/unit'
|
|
# @private
|
|
AssertionError = Test::Unit::AssertionFailedError
|
|
elsif defined?(Test::Unit::AssertionFailedError)
|
|
# Test::Unit has been loaded already, so we use it
|
|
# @private
|
|
AssertionError = Test::Unit::AssertionFailedError
|
|
elsif Gem.ruby_version >= Gem::Version.new("1.9")
|
|
begin
|
|
require 'minitest'
|
|
rescue LoadError
|
|
require 'minitest/unit'
|
|
ensure
|
|
# @private
|
|
AssertionError = MiniTest::Assertion
|
|
end
|
|
else
|
|
raise 'No unit test library available'
|
|
end
|
|
end
|
|
end
|