tengo un rasgo:
trait A { function foo() { ... } }y una clase que usa el rasgo así:
class B { use A { foo as traitFoo; } function foo() { $intermediate = $this->traitFoo(); ... } } Quiero probar el método foo() de la clase y quiero burlarme (con Mockery) del comportamiento del método foo() del rasgo. Intenté usar un traitFoo() parcial y burlón como:
$mock = Mockery::mock(new B()); $mock->shouldReceive('traitFoo')->andReturn($intermediate);Pero no funciona.
¿Es posible hacer esto? ¿Hay una forma alternativa? Quiero probar B::foo() aislándolo de la implementación foo() del rasgo.
Gracias por adelantado.
El simulacro de proxy que está utilizando hace llamadas desde fuera del simulacro, por lo que las llamadas internas dentro de la clase $this->... no se pueden simular.
Si no tiene métodos finales, aún puede usar un simulacro parcial normal o un simulacro parcial pasivo, que amplía la clase simulada y no tiene tales limitaciones:
$mock = Mockery::mock(B::class)->makePartial(); $mock->shouldReceive('traitFoo')->andReturn($intermediate); $mock->foo();ACTUALIZAR:
El ejemplo completo con funciones de rasgos no simuladas:
use Mockery as m; trait A { function foo() { return 'a'; } function bar() { return 'd'; } } class B { use A { foo as traitFoo; bar as traitBar; } function foo() { $intermediate = $this->traitFoo(); return "b$intermediate" . $this->traitBar(); } } class BTest extends \PHPUnit_Framework_TestCase { public function testMe() { $mock = m::mock(B::class)->makePartial(); $mock->shouldReceive('traitFoo')->andReturn('c'); $this->assertEquals('bcd', $mock->foo()); } }