Desidero utilizzare un oggetto fittizio (Mockery) nel mio test PHPUnit. L'oggetto mock deve avere sia alcuni metodi pubblici sia alcune proprietà pubbliche impostate. La classe è un modello eloquente di Laravel. Ho provato questo:Mocking di Laravel Modelli eloquenti: come impostare una proprietà pubblica con Mockery
$mock = Mockery::mock('User');
$mock->shouldReceive('hasRole')->once()->andReturn(true); //works fine
$mock->roles = 2; //how to do this? currently returns an error
$this->assertTrue(someTest($mock));
... ma impostando i rendimenti di proprietà pubblica questo errore:
BadMethodCallException: Method Mockery_0_User::setAttribute() does not exist on this mock object
Questo errore non viene restituito quando beffardo una semplice classe, ma viene restituito quando provo a deridere un Modello eloquente Che cosa sto facendo di sbagliato?
Forse una domanda stupida - ma a seconda di ciò che si sta testando si fa nemmeno bisogno di un oggetto fittizio? Se stai testando (per esempio) il metodo hasRole(), perché non usare $ mock = new User; $ mock-> roles = 2; e testarlo? Ad esempio, se sto verificando accessor/presentatori, eccetto solo un oggetto corretto piuttosto che un mock setAttribute, ecc. – Apemantus
@Apemantus ringraziamenti. Sto testando un modello che ha relazioni (un utente ha molti ruoli). Non sono a conoscenza di un modo per impostare le relazioni senza salvare in un database. Sto provando a scrivere un test che non ha bisogno di toccare il database. – mtmacdonald
OK. Non ho testato le nostre relazioni, ma è possibile fare $ mock-> shouldReceive ('setAttribute') -> con ('roles) -> andReturn (2) - ma restituirà solo il numero intero. È possibile restituire una seconda simulazione di un modello di ruolo, se lo si desidera, come in http://stackoverflow.com/questions/20361364/mocking-models-with-a-relationship-in-laravel?rq=1 – Apemantus