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);