/ / Volviendo al método original en rspec-mocks - ruby, rspec, mocking, stub

Volviendo al método original en rspec-mocks - ruby, rspec, mocking, stub

¿Es posible decirle a RSpec :: Mocks que apague un método para un conjunto de valores, De lo contrario, volver al método original.? Por ejemplo:

File.stub(:exist?).with(/txt/).and_return(true)
File.exist? "log.txt"    # returns true
File.exist? "dev.log"    # <<< need to fallback to original File.exist? here

Actualmente la última llamada en el ejemplo anterior elevaría un MockExpectationError, pidiendo proporcionar un valor por defecto. ¿Es posible dar instrucciones a rspec-mocks para que retrocedan al método original?

Respuestas

5 para la respuesta № 1

Uno podría almacenar en caché el método original y llamarlo explícitamente:

original_method = File.method(:exist?)
File.stub(:exist?).with(anything()) { |*args| original_method.call(*args) }
File.stub(:exist?).with(/txt/).and_return(true)

Sin embargo, esto es demasiado engorroso. Espero ver una mejor respuesta.

En aras de la integridad, aquí hay una generalización del código anterior:

def stub_with_fallback(obj, method)
original_method = obj.method(method)
obj.stub(method).with(anything()) { |*args| original_method.call(*args) }
return obj.stub(method)
end

# usage example:
stub_with_fallback(File, :exist?).with(/txt/).and_return(true)