voz policia para online mujer llamadas llamada jugar juegos falsas falsa descargar con broma ruby unit-testing mocking

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