Prima di tutto, io sono consapevole delle docs stati:derisione Richiedi in laravel 5.1 per Test (reale) Unità
Note: You should not mock the Request facade. Instead, pass the input you desire into the HTTP helper methods such as call and post when running your test.
Ma questo tipo di test sono più simili integrazione o funzionale dal momento che anche sebbene tu stia testando un controller (il SUT
), non lo stai disaccoppiando dalle sue dipendenze (Request
e altri, più su questo più avanti).
Quindi quello che sto facendo, al fine di fare il corretto TDD
ciclo, è beffardo il Repository
, Response
e Request
(che ho problemi con).
mio aspetto test come questo:
public function test__it_shows_a_list_of_categories() {
$categories = [];
$this->repositoryMock->shouldReceive('getAll')
->withNoArgs()
->once()
->andReturn($categories);
Response::shouldReceive('view')
->once()
->with('categories.admin.index')
->andReturnSelf();
Response::shouldReceive('with')
->once()
->with('categories', $categories)
->andReturnSelf();
$this->sut->index();
// Assertions as mock expectations
}
Questo funziona perfettamente bene, e seguono il Arrange, legge, far valere stile.
Il problema è con Request
, come il seguente:
public function test__it_stores_a_category() {
Redirect::shouldReceive('route')
->once()
->with('categories.admin.index')
->andReturnSelf();
Request::shouldReceive('only')
->once()
->with('name')
->andReturn(['name' => 'foo']);
$this->repositoryMock->shouldReceive('create')
->once()
->with(['name' => 'foo']);
// Laravel facades wont expose Mockery#getMock() so this is a hackz
// in order to pass mocked dependency to the controller's method
$this->sut->store(Request::getFacadeRoot());
// Assertions as mock expectations
}
Come potete vedere ho preso in giro Request::only('name')
chiamata. Ma quando ho eseguito $ phpunit
ottengo il seguente errore:
BadMethodCallException: Method Mockery_3_Illuminate_Http_Request::setUserResolver() does not exist on this mock object
Dal momento che non sto chiamando direttamente setUserResolver()
dal mio controller, questo significa che viene chiamato direttamente dalla realizzazione di Request
. Ma perché? Ho preso in giro la chiamata al metodo, non dovrebbe chiamare alcuna dipendenza.
Cosa sto facendo male qui, perché ricevo questo messaggio di errore?
PS: Come bonus, sto guardando nel modo sbagliato forzando TDD con Test unitari su framework Laravel, poiché la documentazione è orientata ai test di integrazione accoppiando l'interazione tra le dipendenze e SUT con $this->call()
?
imbattuto in questo oggi. Correlati: https://twitter.com/laravelphp/status/556568018864459776 – Ravan