2012-07-05 11 views
11

¿Cómo puedo simular las funciones del módulo de un módulo escrito por mí mismo dentro de mi proyecto?¿Cómo burlarse de las funciones del Módulo Ruby?

Dado el módulo y la función

module ModuleA::ModuleB 
    def self.my_function(arg) 
    end 
end 

que se llama igual que

ModuleA::ModuleB::my_function(with_args) 

Cómo debería burlarse de él cuando se utiliza dentro de una función que estoy escribiendo especificaciones para?


duplicarlo (obj = double("ModuleA::ModuleB")) no tiene sentido para mí, como se llama la función en el módulo y no en un objeto.

He intentado copiarlo (ModuleA::ModuleB.stub(:my_function).with(arg).and_return(something)). Obviamente, no funcionó. stub no está definido allí.

Luego lo he intentado con should_receive. De nuevo NoMethodError.

¿Cuál es la forma preferida de burlarse de un módulo y sus funciones?

Respuesta

11

Dado el módulo que usted describe en su pregunta

module ModuleA ; end 

module ModuleA::ModuleB 
    def self.my_function(arg) 
    end 
end 

y la función que se está probando, que llama a la función módulo

def foo(arg) 
    ModuleA::ModuleB.my_function(arg) 
end 

entonces usted puede probar que prueba que foo llamadas myfunction como esto:

describe :foo do 
    it "should delegate to myfunction" do 
    arg = mock 'arg' 
    result = mock 'result' 
    ModuleA::ModuleB.should_receive(:my_function).with(arg).and_return(result) 
    foo(arg).should == result 
    end 
end 
+1

Eso es, básicamente, lo que he intentado. Gracias por el resumen. Sin embargo, mi problema fue que puse ese 'should_receive' en un bloque' before: all'. Obviamente eso no funciona. Que estúpido de mi parte. –

+0

@Torbjoern, oh sí. Estado allí. Me alegro de que haya funcionado. –

+0

En rspec actual (3.6) da "Uso de' should_receive' de rspec-mocks 'old ': should' sintaxis sin habilitar explícitamente la sintaxis está en desuso. Use la nueva sintaxis': expect' o explícitamente habilite ': should' en su lugar. " –

Cuestiones relacionadas