Merge pull request #33162 from utilum/stop_using_mocha

Stop using Mocha
This commit is contained in:
Kasper Timm Hansen 2018-08-22 18:20:25 +02:00 committed by GitHub
commit 9136bb77a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 200 additions and 59 deletions

View File

@ -9,8 +9,6 @@ gemspec
# We need a newish Rake since Active Job sets its test tasks' descriptions.
gem "rake", ">= 11.1"
gem "mocha"
gem "capybara", ">= 2.15"
gem "rack-cache", "~> 1.2"

View File

@ -309,7 +309,6 @@ GEM
marcel (0.3.2)
mimemagic (~> 0.3.2)
memoist (0.16.0)
metaclass (0.0.4)
method_source (0.9.0)
mime-types (3.1)
mime-types-data (~> 3.2015)
@ -324,8 +323,6 @@ GEM
path_expander (~> 1.0)
minitest-server (1.0.5)
minitest (~> 5.0)
mocha (1.5.0)
metaclass (~> 0.0.1)
mono_logger (1.1.0)
msgpack (1.2.4)
msgpack (1.2.4-java)
@ -541,7 +538,6 @@ DEPENDENCIES
libxml-ruby
listen (>= 3.0.5, < 3.2)
minitest-bisect
mocha
mysql2 (>= 0.4.10)
nokogiri (>= 1.8.1)
pg (>= 0.18.0)

View File

@ -1571,8 +1571,9 @@ class EagerAssociationTest < ActiveRecord::TestCase
# CollectionProxy#reader is expensive, so the preloader avoids calling it.
test "preloading has_many_through association avoids calling association.reader" do
ActiveRecord::Associations::HasManyAssociation.any_instance.expects(:reader).never
Author.preload(:readonly_comments).first!
assert_not_called_on_instance_of(ActiveRecord::Associations::HasManyAssociation, :reader) do
Author.preload(:readonly_comments).first!
end
end
test "preloading through a polymorphic association doesn't require the association to exist" do

View File

@ -2134,21 +2134,29 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
end
def test_defining_has_many_association_with_delete_all_dependency_lazily_evaluates_target_class
ActiveRecord::Reflection::AssociationReflection.any_instance.expects(:class_name).never
class_eval(<<-EOF, __FILE__, __LINE__ + 1)
class DeleteAllModel < ActiveRecord::Base
has_many :nonentities, :dependent => :delete_all
end
EOF
assert_not_called_on_instance_of(
ActiveRecord::Reflection::AssociationReflection,
:class_name,
) do
class_eval(<<-EOF, __FILE__, __LINE__ + 1)
class DeleteAllModel < ActiveRecord::Base
has_many :nonentities, :dependent => :delete_all
end
EOF
end
end
def test_defining_has_many_association_with_nullify_dependency_lazily_evaluates_target_class
ActiveRecord::Reflection::AssociationReflection.any_instance.expects(:class_name).never
class_eval(<<-EOF, __FILE__, __LINE__ + 1)
class NullifyModel < ActiveRecord::Base
has_many :nonentities, :dependent => :nullify
end
EOF
assert_not_called_on_instance_of(
ActiveRecord::Reflection::AssociationReflection,
:class_name,
) do
class_eval(<<-EOF, __FILE__, __LINE__ + 1)
class NullifyModel < ActiveRecord::Base
has_many :nonentities, :dependent => :nullify
end
EOF
end
end
def test_attributes_are_being_set_when_initialized_from_has_many_association_with_where_clause

View File

@ -183,5 +183,3 @@ module InTimeZone
ActiveRecord::Base.time_zone_aware_attributes = old_tz
end
end
require "mocha/minitest" # FIXME: stop using mocha

View File

@ -46,35 +46,46 @@ module ActiveRecord
class DatabaseTasksUtilsTask < ActiveRecord::TestCase
def test_raises_an_error_when_called_with_protected_environment
ActiveRecord::MigrationContext.any_instance.stubs(:current_version).returns(1)
protected_environments = ActiveRecord::Base.protected_environments
current_env = ActiveRecord::Base.connection.migration_context.current_environment
assert_not_includes protected_environments, current_env
# Assert no error
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
ActiveRecord::Base.protected_environments = [current_env]
assert_raise(ActiveRecord::ProtectedEnvironmentError) do
assert_called_on_instance_of(
ActiveRecord::MigrationContext,
:current_version,
times: 6,
returns: 1
) do
assert_not_includes protected_environments, current_env
# Assert no error
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
ActiveRecord::Base.protected_environments = [current_env]
assert_raise(ActiveRecord::ProtectedEnvironmentError) do
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
end
end
ensure
ActiveRecord::Base.protected_environments = protected_environments
end
def test_raises_an_error_when_called_with_protected_environment_which_name_is_a_symbol
ActiveRecord::MigrationContext.any_instance.stubs(:current_version).returns(1)
protected_environments = ActiveRecord::Base.protected_environments
current_env = ActiveRecord::Base.connection.migration_context.current_environment
assert_not_includes protected_environments, current_env
# Assert no error
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
ActiveRecord::Base.protected_environments = [current_env.to_sym]
assert_raise(ActiveRecord::ProtectedEnvironmentError) do
assert_called_on_instance_of(
ActiveRecord::MigrationContext,
:current_version,
times: 6,
returns: 1
) do
assert_not_includes protected_environments, current_env
# Assert no error
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
ActiveRecord::Base.protected_environments = [current_env.to_sym]
assert_raise(ActiveRecord::ProtectedEnvironmentError) do
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
end
end
ensure
ActiveRecord::Base.protected_environments = protected_environments
@ -82,10 +93,14 @@ module ActiveRecord
def test_raises_an_error_if_no_migrations_have_been_made
ActiveRecord::InternalMetadata.stub(:table_exists?, false) do
ActiveRecord::MigrationContext.any_instance.stubs(:current_version).returns(1)
assert_raise(ActiveRecord::NoEnvironmentInSchemaError) do
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
assert_called_on_instance_of(
ActiveRecord::MigrationContext,
:current_version,
returns: 1
) do
assert_raise(ActiveRecord::NoEnvironmentInSchemaError) do
ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
end
end
end
end

View File

@ -152,10 +152,14 @@ if current_adapter?(:Mysql2Adapter)
end
def test_establishes_connection_to_mysql_database
with_stubbed_connection_establish_connection do
ActiveRecord::Base.expects(:establish_connection).with @configuration
ActiveRecord::Tasks::DatabaseTasks.drop @configuration
ActiveRecord::Base.stub(:connection, @connection) do
assert_called_with(
ActiveRecord::Base,
:establish_connection,
[@configuration]
) do
ActiveRecord::Tasks::DatabaseTasks.drop @configuration
end
end
end
@ -196,10 +200,14 @@ if current_adapter?(:Mysql2Adapter)
end
def test_establishes_connection_to_the_appropriate_database
with_stubbed_connection_establish_connection do
ActiveRecord::Base.expects(:establish_connection).with(@configuration)
ActiveRecord::Tasks::DatabaseTasks.purge @configuration
ActiveRecord::Base.stub(:connection, @connection) do
assert_called_with(
ActiveRecord::Base,
:establish_connection,
[@configuration]
) do
ActiveRecord::Tasks::DatabaseTasks.purge @configuration
end
end
end

View File

@ -166,12 +166,17 @@ if current_adapter?(:PostgreSQLAdapter)
def test_establishes_connection_to_postgresql_database
ActiveRecord::Base.stub(:connection, @connection) do
ActiveRecord::Base.expects(:establish_connection).with(
"adapter" => "postgresql",
"database" => "postgres",
"schema_search_path" => "public"
)
ActiveRecord::Tasks::DatabaseTasks.drop @configuration
assert_called_with(
ActiveRecord::Base,
:establish_connection,
[
"adapter" => "postgresql",
"database" => "postgres",
"schema_search_path" => "public"
]
) do
ActiveRecord::Tasks::DatabaseTasks.drop @configuration
end
end
end

View File

@ -47,9 +47,9 @@ if current_adapter?(:SQLite3Adapter)
def test_db_create_with_file_does_nothing
File.stub(:exist?, true) do
ActiveRecord::Base.expects(:establish_connection).never
ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
assert_not_called(ActiveRecord::Base, :establish_connection) do
ActiveRecord::Tasks::DatabaseTasks.create @configuration, "/rails/root"
end
end
end

View File

@ -35,6 +35,35 @@ module ActiveSupport
assert_called(object, method_name, message, times: 0, &block)
end
# TODO: No need to resort to #send once support for Ruby 2.4 is
# dropped.
def assert_called_on_instance_of(klass, method_name, message = nil, times: 1, returns: nil)
times_called = 0
klass.send(:define_method, "stubbed_#{method_name}") do |*|
times_called += 1
returns
end
klass.send(:alias_method, "original_#{method_name}", method_name)
klass.send(:alias_method, method_name, "stubbed_#{method_name}")
yield
error = "Expected #{method_name} to be called #{times} times, but was called #{times_called} times"
error = "#{message}.\n#{error}" if message
assert_equal times, times_called, error
ensure
klass.send(:alias_method, method_name, "original_#{method_name}")
klass.send(:undef_method, "original_#{method_name}")
klass.send(:undef_method, "stubbed_#{method_name}")
end
def assert_not_called_on_instance_of(klass, method_name, message = nil, &block)
assert_called_on_instance_of(klass, method_name, message, times: 0, &block)
end
def stub_any_instance(klass, instance: klass.new)
klass.stub(:new, instance) { yield instance }
end

View File

@ -101,6 +101,65 @@ class MethodCallAssertionsTest < ActiveSupport::TestCase
end
end
def test_assert_called_on_instance_of_with_defaults_to_expect_once
assert_called_on_instance_of Level, :increment do
@object.increment
end
end
def test_assert_called_on_instance_of_more_than_once
assert_called_on_instance_of(Level, :increment, times: 2) do
@object.increment
@object.increment
end
end
def test_assert_called_on_instance_of_with_arguments
assert_called_on_instance_of(Level, :<<) do
@object << 2
end
end
def test_assert_called_on_instance_of_returns
assert_called_on_instance_of(Level, :increment, returns: 10) do
assert_equal 10, @object.increment
end
assert_equal 1, @object.increment
end
def test_assert_called_on_instance_of_failure
error = assert_raises(Minitest::Assertion) do
assert_called_on_instance_of(Level, :increment) do
# Call nothing...
end
end
assert_equal "Expected increment to be called 1 times, but was called 0 times.\nExpected: 1\n Actual: 0", error.message
end
def test_assert_called_on_instance_of_with_message
error = assert_raises(Minitest::Assertion) do
assert_called_on_instance_of(Level, :increment, "dang it") do
# Call nothing...
end
end
assert_match(/dang it.\nExpected increment/, error.message)
end
def test_assert_called_on_instance_of_nesting
assert_called_on_instance_of(Level, :increment, times: 3) do
assert_called_on_instance_of(Level, :decrement, times: 2) do
@object.increment
@object.decrement
@object.increment
@object.decrement
@object.increment
end
end
end
def test_assert_not_called
assert_not_called(@object, :decrement) do
@object.increment
@ -117,6 +176,30 @@ class MethodCallAssertionsTest < ActiveSupport::TestCase
assert_equal "Expected increment to be called 0 times, but was called 1 times.\nExpected: 0\n Actual: 1", error.message
end
def test_assert_not_called_on_instance_of
assert_not_called_on_instance_of(Level, :decrement) do
@object.increment
end
end
def test_assert_not_called_on_instance_of_failure
error = assert_raises(Minitest::Assertion) do
assert_not_called_on_instance_of(Level, :increment) do
@object.increment
end
end
assert_equal "Expected increment to be called 0 times, but was called 1 times.\nExpected: 0\n Actual: 1", error.message
end
def test_assert_not_called_on_instance_of_nesting
assert_not_called_on_instance_of(Level, :increment) do
assert_not_called_on_instance_of(Level, :decrement) do
# Call nothing...
end
end
end
def test_stub_any_instance
stub_any_instance(Level) do |instance|
assert_equal instance, Level.new