ruby - policia - llamada falsa huawei
Sistema de llamada simulada en rubĂ. (5)
¿Sabes de una manera de burlarse% []? Estoy escribiendo pruebas para el código que hace algunas llamadas al sistema, por ejemplo:
def log(file)
%x[git log #{file}]
end
y quisiera evitar la ejecución real de llamadas al sistema mientras se prueba este método. Idealmente, me gustaría simular% x [..] y afirmar que se le pasa el comando de shell correcto.
¿No puedes simplemente aprobar la función con un método que devuelve verdadero cuando recibe el comando?
¿Qué tal si lo registra en un archivo de texto o lo envía a su consola?
def log(file)
puts "git log #{file}"
end
No conozco una manera de burlarme de un módulo, me temo. Con Mocha al menos, Kernel.expects
no ayuda. Siempre puedes envolver la llamada en una clase y simular que, algo como esto:
require ''test/unit''
require ''mocha''
class SystemCaller
def self.call(cmd)
system cmd
end
end
class TestMockingSystem < Test::Unit::TestCase
def test_mocked_out_system_call
SystemCaller.expects(:call).with(''dir'')
SystemCaller.call "dir"
end
end
lo que me da lo que esperaría:
Started
.
Finished in 0.0 seconds.
1 tests, 1 assertions, 0 failures, 0 errors
Usando Mocha , si quieres burlarte de la siguiente clase:
class Test
def method_under_test
system "echo ''Hello World!"
`ls -l`
end
end
su prueba se vería algo así como:
def test_method_under_test
Test.any_instance.expects(:system).with("echo ''Hello World!''").returns(''Hello World!'').once
Test.any_instance.expects(:`).with("ls -l").once
end
Esto funciona porque cada objeto hereda métodos como system y `del objeto Kernel.
%x{…}
es una sintaxis incorporada de Ruby que en realidad llamará Backtick (`) del método Kernel. Así que puedes redefinir ese método. Como el método backtick devuelve la salida estándar de ejecutar cmd en una subshell, su método redefinido debería devolver algo similar a eso, por ejemplo, una cadena.
module Kernel
def `(cmd)
"call #{cmd}"
end
end
puts %x(ls)
puts `ls`
# output
# call ls
# call ls