Approx. penerjemah: aturannya sendiri sudah cukup lama, dan contoh yang diberikan dalam artikel, menurut saya, yang paling sederhana. Oleh karena itu, artikel ini lebih cocok untuk pemula, orang dengan pengalaman yang baik dalam menulis autotests mungkin tidak menemukan sesuatu yang baru untuk diri mereka sendiri. UPD. Saya masih tidak berpikir bahwa penulis mengusulkan untuk membungkus semua API kerangka kerja yang Anda kerjakan dengan lapisannya sendiri (yah, itu akan sangat aneh), melainkan tentang kelas tujuan umum yang terstruktur / diketik secara longgar, seperti HttpRequest dari contoh di artikel.
Aplikasi web sering kali dirancang untuk menangani permintaan HTTP. Objek biasanya digunakan untuk merangkum data permintaan. Bergantung pada kerangka kerja, kami mungkin memiliki antarmuka seperti
interface HttpRequest
{
public function get(string $name): string;
// ...
}
atau bahkan kelas tertentu seperti
class HttpRequest
{
public function get(string $name): string
{
// ...
}
// ...
}
yang dapat kita (dan harus) gunakan untuk mengakses data permintaan.
Symfony, misalnya, memiliki Symfony \ Component \ HttpFoundation \ Request :: get (). Sebagai contoh, kami tidak akan khawatir tentang jenis permintaan HTTP yang kami tangani (GET, POST, atau lainnya). Sebagai gantinya, mari fokus pada API implisit seperti HttpRequest :: get () dan masalah yang ditimbulkannya.
, , , 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 .
Anda tentu saja harus membuat pembungkus permintaan Anda spesifik untuk setiap pengontrol. Apakah kode Anda memerlukan tajuk khusus? Buat metode untuk mendapatkannya. Apakah kode Anda memerlukan file yang diunggah? Buat metode untuk mendapatkan ini persis.
Permintaan HTTP lengkap dapat berisi header, nilai, mungkin file yang diunggah, badan POST, dll. Menyiapkan rintisan pengujian atau tiruan untuk semua ini saat Anda tidak memiliki antarmuka mencegah Anda menyelesaikan pekerjaan. Mendefinisikan antarmuka Anda sendiri sangat menyederhanakan tugas.