Class: Object

Inherits:
BasicObject
Includes:
Minitest::Expectations
Defined in:
lib/minitest/mock.rb,
lib/minitest/spec.rb

Overview

:nodoc:

Instance Method Summary collapse

Methods included from Minitest::Expectations

#assert_empty, #assert_equal, #assert_in_delta, #assert_in_epsilon, #assert_includes, #assert_instance_of, #assert_kind_of, #assert_match, #assert_nil, #assert_operator, #assert_output, #assert_path_exists, #assert_raises, #assert_respond_to, #assert_same, #assert_silent, #assert_throws, #refute_empty, #refute_equal, #refute_in_delta, #refute_in_epsilon, #refute_includes, #refute_instance_of, #refute_kind_of, #refute_match, #refute_nil, #refute_operator, #refute_path_exists, #refute_respond_to, #refute_same

Instance Method Details

#stub(name, val_or_callable, *block_args, **block_kwargs, &block) ⇒ Object

Add a temporary stubbed method replacing name for the duration of the block. If val_or_callable responds to #call, then it returns the result of calling it, otherwise returns the value as-is. If stubbed method yields a block, block_args will be passed along. Cleans up the stub at the end of the block. The method name must exist before stubbing.

def test_stale_eh
  obj_under_test = Something.new
  refute obj_under_test.stale?

  Time.stub :now, Time.at(0) do
    assert obj_under_test.stale?
  end
end

– NOTE: keyword args in callables are NOT checked for correctness against the existing method. Too many edge cases to be worth it.


270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
# File 'lib/minitest/mock.rb', line 270

def stub name, val_or_callable, *block_args, **block_kwargs, &block
  new_name = "__minitest_stub__#{name}"

  metaclass = class << self; self; end

  if respond_to? name and not methods.map(&:to_s).include? name.to_s then
    metaclass.send :define_method, name do |*args, **kwargs|
      super(*args, **kwargs)
    end
  end

  metaclass.send :alias_method, new_name, name

  metaclass.send :define_method, name do |*args, **kwargs, &blk|
    if val_or_callable.respond_to? :call then
      if kwargs.empty? then # FIX: drop this after 2.7 dead
        val_or_callable.call(*args, &blk)
      else
        val_or_callable.call(*args, **kwargs, &blk)
      end
    else
      if blk then
        if block_kwargs.empty? then # FIX: drop this after 2.7 dead
          blk.call(*block_args)
        else
          blk.call(*block_args, **block_kwargs)
        end
      end
      val_or_callable
    end
  end

  block[self]
ensure
  metaclass.send :undef_method, name
  metaclass.send :alias_method, name, new_name
  metaclass.send :undef_method, new_name
end