نسخه:

آزمایش کردن

معرفی

لاراول با در نظر گرفتن تست واحد ساخته شده است. در واقع، پشتیبانی از آزمایش با PHPUnit خارج از جعبه گنجانده شده است، و یک phpunit.xml فایل از قبل برای برنامه شما تنظیم شده است. علاوه بر PHPUnit، لاراول از اجزای Symfony HttpKernel، DomCrawler و BrowserKit نیز استفاده می‌کند تا به شما امکان بازرسی و دستکاری نماهای خود را در حین آزمایش، شبیه‌سازی یک مرورگر وب را بدهد.

نمونه فایل آزمایشی در app/tests دایرکتوری ارائه شده است. پس از نصب یک برنامه جدید لاراول، به سادگی phpunit در خط فرمان اجرا کنید تا تست های خود را اجرا کنید.

تعریف و اجرای تست ها

برای ایجاد یک تست، به سادگی یک فایل آزمایشی جدید در app/tests دایرکتوری ایجاد کنید. کلاس آزمون باید گسترش یابد TestCase . سپس می‌توانید روش‌های تست را همانطور که معمولاً هنگام استفاده از PHPUnit تعریف می‌کنید، تعریف کنید.

یک کلاس آزمایشی نمونه

class FooTest extends TestCase {
 
public function testSomethingIsTrue()
{
$this->assertTrue(true);
}
 
}

شما می توانید با اجرای دستور از ترمینال خود، تمام تست های برنامه خود را اجرا کنید phpunit .

توجه: اگر روش خود را تعریف می کنید setUp ، حتماً تماس بگیرید parent::setUp .

محیط آزمایش

هنگام اجرای تست های واحد، لاراول به طور خودکار محیط پیکربندی را روی testing . همچنین لاراول شامل فایل های پیکربندی برای session و cache در محیط تست می باشد. array هر دوی این درایورها در محیط تست تنظیم شده‌اند ، به این معنی که هیچ داده‌ای از جلسه یا حافظه پنهان در حین آزمایش باقی نمی‌ماند. در صورت لزوم می توانید تنظیمات محیط آزمایشی دیگری را ایجاد کنید.

فراخوانی مسیرهای آزمایشی

فراخوانی یک مسیر از آزمون

با استفاده از روش زیر می توانید به راحتی با یکی از مسیرهای خود برای آزمایش تماس بگیرید call :

$response = $this->call('GET', 'user/profile');
 
$response = $this->call($method, $uri, $parameters, $files, $server, $content);

سپس می توانید Illuminate\Http\Response شی را بررسی کنید:

$this->assertEquals('Hello World', $response->getContent());

فراخوانی یک کنترلر از یک تست

همچنین می توانید از یک آزمایش با یک کنترلر تماس بگیرید:

$response = $this->action('GET', 'HomeController@index');
 
$response = $this->action('GET', 'UserController@profile', array('user' => 1));

این getContent روش محتوای رشته ارزیابی شده پاسخ را برمی گرداند. اگر مسیر شما یک را برگرداند View ، می توانید با استفاده از original ویژگی به آن دسترسی داشته باشید:

$view = $response->original;
 
$this->assertEquals('John', $view['name']);

برای فراخوانی مسیر HTTPS، می‌توانید از callSecure روش زیر استفاده کنید:

$response = $this->callSecure('GET', 'foo/bar');

توجه: فیلترهای مسیر در محیط تست غیرفعال می شوند. برای فعال کردن آنها، Route::enableFilters() به تست خود اضافه کنید.

خزنده DOM

همچنین می‌توانید یک مسیر را فراخوانی کنید و یک نمونه DOM Crawler را دریافت کنید که می‌توانید از آن برای بررسی محتوا استفاده کنید:

$crawler = $this->client->request('GET', '/');
 
$this->assertTrue($this->client->getResponse()->isOk());
 
$this->assertCount(1, $crawler->filter('h1:contains("Hello World!")'));

برای اطلاعات بیشتر در مورد نحوه استفاده از خزنده، به مستندات رسمی آن مراجعه کنید .

نماهای تقلید

هنگام آزمایش، ممکن است اغلب بخواهید تماس با نمای استاتیک لاراول را تقلید کنید. به عنوان مثال، عمل کنترلر زیر را در نظر بگیرید:

public function getIndex()
{
Event::fire('foo', array('name' => 'Dayle'));
 
return 'All done!';
}

Event ما می‌توانیم با استفاده از متد روی نما ، فراخوانی کلاس را تقلید کنیم ، که نمونه‌ای از یک Mocky Mocky shouldReceive را برمی‌گرداند .

تقلید یک نما

public function testGetIndex()
{
Event::shouldReceive('fire')->once()->with('foo', array('name' => 'Dayle'));
 
$this->call('GET', '/');
}

توجه: نباید Request نما را تقلید کنید. call در عوض، هنگام اجرای آزمون، ورودی مورد نظر خود را به روش ارسال کنید .

ادعاهای چارچوب

لاراول چندین assert روش را برای آسان‌تر کردن آزمایش ارائه می‌کند:

ادعای پاسخ ها درست است

public function testMethod()
{
$this->call('GET', '/');
 
$this->assertResponseOk();
}

اظهار وضعیت پاسخ

$this->assertResponseStatus(403);

ادعای پاسخ ها تغییر مسیر هستند

$this->assertRedirectedTo('foo');
 
$this->assertRedirectedToRoute('route.name');
 
$this->assertRedirectedToAction('Controller@method');

ادعای نما مقداری داده دارد

public function testMethod()
{
$this->call('GET', '/');
 
$this->assertViewHas('name');
$this->assertViewHas('age', $value);
}

ادعای جلسه دارای مقداری داده است

public function testMethod()
{
$this->call('GET', '/');
 
$this->assertSessionHas('name');
$this->assertSessionHas('age', $value);
}

ادعای جلسه دارای خطا است

public function testMethod()
{
$this->call('GET', '/');
 
$this->assertSessionHasErrors();
 
// Asserting the session has errors for a given key...
$this->assertSessionHasErrors('name');
 
// Asserting the session has errors for several keys...
$this->assertSessionHasErrors(array('name', 'age'));
}

ادعای ورودی قدیمی مقداری داده دارد

public function testMethod()
{
$this->call('GET', '/');
 
$this->assertHasOldInput();
}

روش های کمکی

این TestCase کلاس شامل چندین روش کمکی برای آسان‌تر کردن آزمایش برنامه شما است.

تنظیم و شستشوی جلسات از آزمون ها

$this->session(['foo' => 'bar']);
 
$this->flushSession();

تنظیم کاربر تأیید شده فعلی

می توانید کاربر تأیید شده فعلی را با استفاده از be روش زیر تنظیم کنید:

$user = new User(array('name' => 'John'));
 
$this->be($user);

بذر مجدد پایگاه داده از آزمایشات

شما می توانید پایگاه داده خود را از یک آزمایش با استفاده از روش زیر دوباره بکار ببرید seed :

$this->seed();
 
$this->seed('DatabaseSeeder');

اطلاعات بیشتر در مورد ایجاد دانه‌ها را می‌توانید در بخش مهاجرت و کاشت مستندات بیابید .

تازه کردن برنامه

همانطور که قبلاً می دانید، می توانید Application از طریق هر روش آزمایشی به کانتینر Laravel / IoC خود دسترسی داشته باشید $this->app . این نمونه برنامه برای هر کلاس آزمایشی به روز می شود. اگر می‌خواهید به‌طور دستی برنامه را مجبور کنید برای یک روش معین به‌روزرسانی شود، می‌توانید refreshApplication از روش روش آزمایشی خود استفاده کنید. با این کار هرگونه اتصال اضافی، مانند mock، که از زمان شروع آزمایش در کانتینر IoC قرار گرفته اند، بازنشانی می شود.