Ho bisogno di estendere una classe di terze parti che non posso modificare. Le dipendenze della classe sono per lo più iniettate attraverso il costruttore, rendendole facili da prendere in giro. Tuttavia, la classe utilizza anche metodi tratti da un tratto che chiama direttamente i servizi globali, distruggendo l'isolamento del test. Ecco un esempio di codice che illustra il problema:
trait SomeTrait {
public function irrelevantTraitMethod() {
throw new \Exception('Some undesirable behavior.');
}
}
class SomeSystemUnderTest {
use SomeTrait;
public function methodToTest($input) {
$this->irrelevantTraitMethod();
return $input;
}
}
class MockWithTraitTest extends \PHPUnit_Framework_TestCase {
public function testMethodToTest() {
$sut = new SomeSystemUnderTest();
$this->assertSame(123, $sut->methodToTest(123)); // Unexpected exception!
}
}
Come si fa ad affrontare una situazione come questa in PHPUnit? I tratti possono essere derisi e iniettati in qualche modo? L'unica soluzione che ho trovato è di prendere in giro il SUT stesso e solo annullare i fastidiosi metodi del tratto, lasciando intatti i veri metodi SUT. Ma non sembra giusto.