Chào các bạn, chào mừng các bạn đến với phần 4! Hôm nay chúng ta sẽ học thế nào là Mocking. Mocking là một tiến trình mà trong đó bạn có thể tạo một đối tượng ảo của một lớp thực và kiểm tra nó. Chính vì vậy, bạn không phải lo lắng về chức năng thực sự của các phụ thuộc bên ngoài trong một lớp. Điều này làm cho việc kiểm tra đơn vị (unit testing) trở nên dễ dàng và đáng tin cậy hơn.
Bởi vì PHPUnit không có chức năng Mocking và không được phát triển đầy đủ như Mockery (http://docs.mockery.io/en/latest/) nên chúng ta sẽ sử dụng Mockery cho tất cả các mocking cần làm. Có một điều tốt nữa là trong Laravel mặc định chứa Mockery nên chúng ta có thể bắt đầu ngay lập tức mà không cần cài đặt hay cấu hình.
Đầu tiên, hãy viết một vài mã mẫu mà chúng tôi sẽ sử dụng. Với mục đích làm cho nó đơn giản, chúng tôi sẽ chỉ tạo một lớp trình bao bọc (wrapper class). Một lớp wrapper có tên là “Math” được gọi lớp “Calculate”. Lớp “Calculate” này giống với lớp mà chúng tôi đã thực hiện trong tập trước. Hãy tạo ra tập tin này với đường dẫn “app/Math.php”.
<?php namespace App; class Math { /** * @var Calculate */ public $calculate; /** * Math constructor. * * @param Calculate $calculate */ public function __construct(Calculate $calculate) { $this->calculate = $calculate; } /** * Get Area * * @param $length * * @return float|int */ public function getArea($length) { return $this->calculate->areaOfSquare($length); } }
Ở dòng 16, chúng tôi yêu cầu một lớp Calculate trong cùng một namespace “App”. Sau đó, chúng ta gán nó cho cùng một đối tượng trên dòng 18. Hãy nhớ luôn luôn chọn cách tiêm phụ thuộc thông qua hàm tạo thay vì tạo chúng thông qua từ khóa “new” trong các phương thức. Điều này làm cho việc kiểm tra dễ dàng hơn rất nhiều khi chúng tôi thực hiện các mocks. Các bạn vẫn có thể giả lập tính năng khởi tạo từ khóa “new” bằng cách sử dụng Mockery nhưng đây không phải là một ý tưởng hay. Có một cách khác là sử dụng statics, nó tránh việc gọi tĩnh và thay vào đó sử dụng các lớp tương đương của chúng thông qua hàm tạo. Nếu bạn sử dụng framework Laravel, bạn có thể kiểm tra lớp facade tham chiếu đến những lớp mà bạn có thể sử dụng thay vì gọi tĩnh. Tham chiếu lớp facade tại: https://laravel.com/docs/5.7/facades#facade- class-report
Dòng 30 là nơi chúng ta gọi phương thức areaOfSapes của phụ thuộc ($this->calculate).
Vì vậy, làm thế nào chúng ta sẽ đi kiểm tra lớp này? Đây là cách chúng ta sẽ làm điều đó.
<?php namespace Tests\Unit; use App\Math; use Mockery as m; use Mockery\Adapter\Phpunit\MockeryTestCase; class MathTest extends MockeryTestCase { public function setUp() { $this->calculate = m::mock('App\Calculate'); $this->math = new Math($this->calculate); } public function test_getArea_WhenCalledWithLength2_Return4() { $this->calculate->shouldReceive('areaOfSquare') ->andReturn(4) ->once(); $length = 2; $response = $this->math->getArea($length); $this->assertTrue(is_int($response)); $this->assertEquals(4, $response); } }
Hãy thêm tập tin này vào thư mục ‘/ tests / Unit’.
Hãy để chạy thử nghiệm này trên dấu nhắc lệnh:
Tuyệt vời, 1 bài kiểm tra đã được thông qua với 3 xác nhận. Hai xác nhận giống như trước đây trên dòng 27 và 28. Và một xác nhận mới nữa là của Mockery trên dòng 19.
Trên dòng 5, chúng tôi khẳng định rằng chúng tôi sẽ sử dụng lớp Mockery với tài liệu tham khảo.
Dòng 6 là một thay đổi mới. Thay vì sử dụng PHPUnit TestCase mặc định, ở đây chúng tôi sử dụng Mockery từ TestCase. Điều này là để Mockery có thể thực hiện xác minh xác nhận cụ thể của Mockery và clean quy trình sau mỗi cuộc gọi thử nghiệm.
Đối với những độc giả đã sử dụng Mockery trước đây, bạn có thể bị nhầm lẫn. Trước đây, bạn phải chạy m :: close () trên phương thức tornDown () cho mỗi lớp kiểm tra. Điều này đã thay đổi kể từ Mockery v1.0.0. Bạn không cần phải làm điều đó nếu thay vào đó bạn mở rộng lớp Mockery nhóm TestCase hoặc sử dụng tính năng này. Thông tin thêm về vấn đề này tại đây: (http://docs.mockery.io/en/latest/reference/phastait_integration.html).
Dòng 12 là nơi chúng ta tạo ra một đối tượng giả có namespace là “App\Calculate”. Không gian tên này phải giống với lớp “ Calculate” ban đầu, nếu không nó sẽ gây ra lỗi.
Sau đó, trên dòng 14, chúng ta chuyển đối tượng giả mới được tạo đó sang thể hiện mới của lớp Math.
Bây giờ trên dòng 19, là nơi xác nhận cụ thể của Mockery bắt đầu. Bây giờ, chúng tôi khẳng định rằng lớp “ Calculate” sẽ nhận được cuộc gọi phương thức “areaOfSapes”, và chúng tôi sẽ trả về 4 khi thực hiện. Và nó chỉ nên được gọi một lần trong suốt quá trình thực hiện kiểm tra, nếu không nó sẽ thất bại. Nếu bạn muốn nó chạy hai lần, bạn có thể làm ->twice() hoặc times({number}) cho bất kỳ số lần nào.
Có nhiều cách và kỹ thuật khác nhau để tuyên bố kỳ vọng theo nhu cầu của bạn. Tôi khuyến khích bạn kiểm tra tài liệu chính thức để tham khảo đầy đủ tại http://docs.mockery.io/en/latest/reference/recectations.html. Vậy là chúng ta đã biết thế nào là mocks. Vẫn còn nhiều điều nữa để tìm hiểu về mocks và chúng tôi sẽ sử dụng nó rộng rãi trong các tập tiếp theo khi chúng tôi tiếp tục giải quyết TDD.
Trong tập tiếp theo, chúng ta sẽ đi và tìm hiểu về kiểm thử tích hợp (Integration tests). Các kiểm thử mà không sử dụng mocks mà gọi các triển khai thực sự.
Author: Phan Văn Luân
Đăng ký nhận bộ tài liệu học Java trên 2 trang giấy tại đây
Xem thêm: Java Coding Bootcamp là gì? Tổng quan về Java Coding Bootcamp
0 Lời bình
Trackbacks/Pingbacks