Unit Testing

Laravel สร้างขึ้นมาด้วยแนวคิดของการทดสอบเป็นเบื้องต้นอยู่เเล้วครับ โดยหลักแล้วจะสนับสนุนไลบราลี่ PHPUnit เป็นพื้นฐาน และ phpunit.xmlไฟล์ได้ถูกเตรียมการเอาไว้ให้แล้ว. Laravel เตรียมคลาส Symfony HttpKernel, DomCrawler, และ BrowserKit components ที่อนุญาตให้เราจำลองบราวเซอร์ขึ้นมาเเละเข้าไปแก้ไขไฟล์ html ได้ ตัวอย่างไฟล์อยู่ที่โฟลเดอร์ app/tests <a name="defining-and-running-tests"></a> ## Defining & Running Tests

การสร้างไฟล์สำหรับทดสอบนั้นเราจะไปสร้างที่โฟลเดอร์ app/tests สร้างคลาสที่สืบทอดคลาส TestCase.

ตัวอย่างคลาสสำหรับใช้ทดสอบ

1 class FooTest extends TestCase {
2 
3 	public function testSomethingIsTrue()
4 	{
5 		$this->assertTrue(true);
6 	}
7 
8 }

เราจะทำการทดสอบโดยรัน phpunit บน commandline

หมายเหตุ: ถ้าคุณประกาศเมทอด setUp มั่นใจว่าได้เรียก parent::setUpแล้ว

<a name="test-environment"></a> ## สภาวะการตั้งค่าสำหรับการทดสอบ

เมื่อใช้งาน unit tests, Laravel จะทำการเปลี่ยนการสภาวะการตั้งค่าให้ไปเป็น testing. และจะตัดการทำงานของ session และ cache หมายความว่าจะไม่มีแคชและ session เกิดขึ้นระหว่างการทดสอบ <br /><br /><br /><br /><br /><br /> <a name="calling-routes-from-tests"></a> ## การเรียก Routes ในขณะทดสอบ

ตัวอย่างการเรียก Route ในขณะทำกาารทดสอบ

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

เราสามารถตรวจสอบออปเจค Illuminate\Http\Response

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

ตัวอย่างการเรียก Controller ในขณะทดสอบ

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

เมทอด getContent จะส่งค่าเป็นตัวอักษรกลับคืนมา View เราสามารถเข้าถึงได้ด้วยตัวแปร original

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

ถ้าจะเรียก HTTPS route,เราต้องใช้เมทอดcallSecure

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

DOM Crawler

คลาส DOM Crawler ทำให้เราสามารถตรวจสอบ html ที่ถูกสร้างขึ้นมาระหว่างการทดสอบได้ ตัวอย่างการใช้

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

<a name="mocking-facades"></a> ## Mocking Facades

เมื่อเราทำการทดสอบ,เราจะทำการจำลองในการเรีกคลาส Facade ตัวอย่างเราจะทำการเรียก controller

1 public function getIndex()
2 {
3 	Event::fire('foo', array('name' => 'Dayle'));
4 
5 	return 'All done!';
6 }

เราสามารถจำลองคลาสEventโดยใช้เมทอด shouldReceive

การจำลองคลาส Facade

1 public function testGetIndex()
2 {
3 	Event::shouldReceive('fire')->once()->with(array('name' => 'Dayle'));
4 
5 	$this->call('GET', '/');
6 }

หมายเหตุ: คุณไม่ควรจำลองคลาส Facade Request ใช้เมทอด call ดีกว่าครับ

<a name="framework-assertions"></a> ## Framework Assertions

เมทอด assert ใช้ในการตรวจสอบว่าค่าที่ออกมาตรงกับที่เราคาดหวังไว้ไหม

คาดหวังว่าค่าที่ส่งมาจะไม่ผิดพลาด

1 public function testMethod()
2 {
3 	$this->call('GET', '/');
4 
5 	$this->assertResponseOk();
6 }

คาดหวังว่าจะเป็น 403

1 $this->assertResponseStatus(403);

คาดหวังว่าฟังก์ชันจะส่งกลับไปที่ route

1 $this->assertRedirectedTo('foo');
2 
3 $this->assertRedirectedToRoute('route.name');
4 
5 $this->assertRedirectedToAction('Controller@method');

คาดหวังว่าในหน้า view จะมีค่า

1 public function testMethod()
2 {
3 	$this->call('GET', '/');
4 
5 	$this->assertViewHas('name');
6 	$this->assertViewHas('age', $value);
7 }

คาดหวังว่าใน session จะมีค่า

1 public function testMethod()
2 {
3 	$this->call('GET', '/');
4 
5 	$this->assertSessionHas('name');
6 	$this->assertSessionHas('age', $value);
7 }

<a name="helper-methods"></a> ## Helper Methods

คลาส TestCase มีเมทอดช่วยให้เราทำการทดสอบได้ง่ายๆ เยอะเลยครับ.

เมทอด beใช้ในการจำลองการล็อกอิน

ตัวอย่าง

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