Zunächst einmal bin ich bewusst die docs Zustände:Mocking Antrag in Laravel 5.1 (Ist) Unit Test
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.
Aber diese Art von Tests sind eher wie Integration oder funktionelle da selbst Obwohl Sie einen Controller (SUT
) testen, entkoppeln Sie ihn nicht von seinen Abhängigkeiten (Request
und andere, mehr dazu später).
Also, was ich tue, um die richtige TDD
Schleife zu tun, verhöhnt die Repository
, Response
und Request
(was ich habe Probleme mit).
Mein Test sieht wie folgt aus:
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
}
Das funktioniert völlig in Ordnung, und sie folgen der anordnen, Act, Assert Stil.
Das Problem ist mit Request
, wie folgt aus:
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
}
Wie man sehen kann ich Request::only('name')
Anruf verspottet haben. Aber wenn ich $ phpunit
laufen bekomme ich folgende Fehlermeldung:
BadMethodCallException: Method Mockery_3_Illuminate_Http_Request::setUserResolver() does not exist on this mock object
Da ich nicht direkt setUserResolver()
von meinem Controller nennen, das bedeutet, es direkt durch die Umsetzung der Request
genannt wird. Aber warum? Ich verspottete den Methodenaufruf, er sollte keine Abhängigkeit aufrufen.
Was mache ich hier falsch, warum bekomme ich diese Fehlermeldung?
PS: Als ein Bonus, schaue ich es falsch, indem ich TDD mit Unit Tests auf Laravel-Framework gezwungen, wie es scheint, die Dokumentation ist auf Integrationstests durch Kopplung Interaktion zwischen Abhängigkeiten und SUT mit $this->call()
ausgerichtet?
in diese heute Ran. Related: https://twitter.com/laravelphp/status/556568018864459776 – Ravan