Environ. traducteur: la rĂšgle elle-mĂȘme est assez ancienne, et l'exemple donnĂ© dans l'article est, Ă mon avis, le plus simple. Par consĂ©quent, l'article est plus adaptĂ© aux dĂ©butants, les personnes ayant une bonne expĂ©rience dans la rĂ©daction de tests automatiques peuvent ne rien trouver de nouveau pour elles-mĂȘmes. UPD. Je ne pense toujours pas que l'auteur propose d'envelopper toutes les API du framework avec lequel vous travaillez avec sa propre couche (enfin, ce serait extrĂȘmement Ă©trange), mais il s'agit plutĂŽt de classes Ă usage gĂ©nĂ©ral faiblement structurĂ©es / typĂ©es, comme HttpRequest de l'exemple de l'article.
Les applications Web sont souvent conçues pour gĂ©rer les requĂȘtes HTTP. Les objets sont couramment utilisĂ©s pour encapsuler les donnĂ©es de demande. Selon le framework, nous pourrions avoir une interface comme
interface HttpRequest
{
public function get(string $name): string;
// ...
}
ou mĂȘme une classe spĂ©cifique comme
class HttpRequest
{
public function get(string $name): string
{
// ...
}
// ...
}
que nous pouvons (et devrions) utiliser pour accéder aux données de la demande.
Symfony, par exemple, a Symfony \ Component \ HttpFoundation \ Request :: get (). Ă titre d'exemple, nous ne nous soucierons pas du type de requĂȘte HTTP que nous traitons (GET, POST ou autre). Au lieu de cela, concentrons-nous sur les API implicites comme HttpRequest :: get () et les problĂšmes qu'elles posent.
, , , get() , . . get():
class SomeController
{
public function execute(HttpRequest $request): HttpResponse
{
$id = $request->get('id');
$amount = $request->get('amount');
$price = $request->get('price');
// ...
}
}
, action- (: (eng )). , HTTP-.
HttpRequest (stub) mock- SomeController , get() , : 'id', 'amount' 'price'.
, , action- .
SomeController HttpRequest (stub) unit PHPUnit :
$request = $this->createStub(HttpRequest::class);
$request->method('get')
->willReturnOnConsecutiveCalls(
'1',
'2',
'3',
);
$controller = new SomeController;
$controller->execute($request);
SomeController HttpRequest, mock-, :
$request = $this->createMock(HttpRequest::class);
$request->expects($this->exactly(3))
->method('get')
->withConsecutive(
['id'],
['amount'],
['price']
)
->willReturnOnConsecutiveCalls(
'1',
'2',
'3',
);
$controller = new SomeController;
$controller->execute($request);
, HttpRequest::get() : «id», «amount» , , «price».
SomeController::execute(), HttpRequest::get(), . , . .
, HTTP-, API, , HTTP, get(). , , , : HttpRequest , .
« , » « , ». 2009 « - »:
« , , , , , . , , , , , ».
, , ? :
« [...] , , - , , . [...], - API [...] "
:
interface SomeRequestInterface
{
public function getId(): string;
public function getAmount(): string;
public function getPrice(): string;
}
, , value-. .
SomeRequestInterface :
$request = $this->createStub(SomeRequestInterface::class);
$request->method('getId')
->willReturn(1);
$request->method('getAmount')
->willReturn(2);
$request->method('getPrice')
->willReturn(3);
, HTTP- , - HTTP- . . HTTP- . . :
class SomeRequest implements SomeRequestInterface
{
private HttpRequest $request;
public function __construct(HttpRequest $request)
{
$this->request = $request;
}
public function getId(): string
{
return $this->request->get('id');
}
public function getAmount(): string
{
return $this->request->get('amount');
}
public function getPrice(): string
{
return $this->request->get('price');
}
}
:
class SomeController
{
public function execute(HttpRequest $request)
{
return $this->executable->execute(
new SomeRequest($request)
)
}
}
SomeController , , HTTP .
Vous devrez, bien sĂ»r, rendre votre wrapper de requĂȘte spĂ©cifique Ă chaque contrĂŽleur. Votre code a-t-il besoin d'en-tĂȘtes spĂ©cifiques? CrĂ©ez une mĂ©thode pour les obtenir. Votre code a-t-il besoin d'un fichier tĂ©lĂ©chargĂ©? CrĂ©ez une mĂ©thode pour obtenir exactement cela.
Une requĂȘte HTTP complĂšte peut contenir des en-tĂȘtes, des valeurs, peut-ĂȘtre des fichiers tĂ©lĂ©chargĂ©s, un corps POST, etc. Mettre en place un stub de test ou une maquette pour tout cela alors que vous ne possĂ©dez pas l'interface vous empĂȘche de faire le travail. La dĂ©finition de votre propre interface simplifie grandement la tĂąche.