Method: Object#stub

Defined in:
lib/minitest/mock.rb

#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.



298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
# File 'lib/minitest/mock.rb', line 298

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

  if ENV["MT_KWARGS_HAC\K"] then
    metaclass.send :define_method, name do |*args, &blk|
      if val_or_callable.respond_to? :call then
        val_or_callable.call(*args, &blk)
      else
        blk.call(*block_args, **block_kwargs) if blk
        val_or_callable
      end
    end
  else
    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
  end

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