2010-03-09 13 views
7

¿Hay alguna forma de establecer una variable de nivel de clase dentro de un objeto simulado?Cómo establecer una variable dentro de un objeto simulado

que tienen el objeto de burla conjunto similar a esto:

$stub = $this->getMock('SokmeClass', array('method')); 
$stub->expects($this->once()) 
     ->method('method') 
     ->with($this->equalTo($arg1)); 

Ganar la clase real hay una variable que se debe establecer para que funcione correctamente. ¿Cómo puedo establecer esa variable dentro de un objeto simulado?

Respuesta

2

La idea de un apéndice es reemplazar una dependencia con un doble de prueba que ofrezca la misma interfaz de método que (opcionalmente) devuelve valores de retorno configurados. De esta forma, el SUT puede funcionar con el doble como si fuera la dependencia. Si necesita un valor de retorno específico del talón, que acaba de decir que lo que se debe devolver, por ejemplo .:

// Create a stub for the SomeClass class. 
$stub = $this->getMock('SomeClass'); 

// Configure the stub. 
$stub->expects($this->any()) 
    ->method('doSomething') 
    ->will($this->returnArgument(0)); 

$stub->doSomething('foo'); // returns foo 

Ver http://www.phpunit.de/manual/current/en/test-doubles.html

+0

Creo que debería haber hecho el ejemplo más fácil de entender. La clase es algo similar a esto: clase SomeClass { $ someVar; función pública setSomeVar (Color $ azul) { $ someVar = "Azul"; } función pública getSomeVar() { return $ someVar; } } En el Objecto Falso, no puedo configurar la variable, así que cuando la uso en cualquier otro lugar del objeto obtengo un nulo ... – Enrique

+0

@Enrique Hmm, tu o yo no lo recibimos :) puede decirle al Mock qué debería devolver cuando lo creas. No hay necesidad de establecer nada dentro de él. Si quieres que vuelva azul, dile que vuelva azul. – Gordon

+0

@Gordon OK. Tal vez me estoy perdiendo algo. Déjame intentar explicar la situación en la que estoy sin derramar demasiados frijoles. Tengo un método 'queue' que envía datos a una tabla. para que 'cola' ejecute una variable de nivel de clase $ tiene que establecerse el transporte o de lo contrario arroja un error (por no saber a dónde ir).Necesito configurar $ transporte a algo que no sea nulo y el colocador no devuelve un argumento (no hay getter para el método 'queue' para llamar. Su antiguo código heredado ...) – Enrique

5

No sabe por qué esto funciona, pero parece que para mí. Si coloca el método mágico __get como uno de los métodos reemplazados, p.

$mock = $this->getMock('Mail', array('__get')); 

Puede entonces puede hacerlo con éxito

$mock->transport = 'smtp'; 
11

Esto es lo que funciona para mí:

$stub = $this->getMock('SomeClass'); 
$stub->myvar = "Value"; 
+1

Creo que esta es la respuesta que más simplemente responde la pregunta que se hace. El póster pregunta por variables de instancia y no por métodos. Varias otras respuestas parecen enfocarse en los métodos. La respuesta de @ Nat es la misma que esta, excepto que no es necesario anular el método __get (al menos no en la última versión) –

+0

Bien hecho, PhpUnit. –

0

que va a sugerir la siguiente teniendo en cuenta la discusión en los comentarios que tenía con @Gordon.

Creo que lo que necesita darse cuenta es que realmente está probando los getters/setters y no la lógica real que está implementando.

Probablemente deba desglosar el código en trozos más pequeños que pueda probar.

Luego proceda a probar los datos que espera de los métodos más pequeños. (Puede probar métodos protegidos)

En el código real, puede llamar a esos trozos más pequeños (métodos) y rellenar el objeto que desea en otra función pública (que no debe probarse porque establece y obtiene variables a un objeto) debería ser simple ni siquiera valdría la pena probarlo)

Cuestiones relacionadas