Ne mouillez pas ce que vous ne possédez pas

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.








All Articles