Hướng dẫn phpunit mock constructor - phương thức khởi tạo giả phpunit

Trong bài trước, chúng ta đã được tìm hiểu về các khái niệm rất quan trọng đó là

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];
7 và
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];
8. Các khái niệm này là trọng tâm của 1 unit test thành công, và một khi nó đã đi sâu vào tâm trí của bạn, bạn sẽ bắt đầu nhận ra unit có ích và đơn giản như thế nào.

Có một thứ khác mà tôi muốn làm rõ đó là: tạo unit tests chỉ đơn giản là 1 trò chơi puzzle, bạn chỉ cần đi từng bước 1, và chắc chắn rằng tất cả các mảnh ghép được khớp đúng với nhau. Tôi hy vọng sẽ làm rõ được điều này sau khi kết thúc bài này.

Mock methods

Bạn đã được biết về

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];
9 và
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
0. Có 1 khái niệm khác cũng khá quan trọng bạn cần phải biết đó là:
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
1.

Mock Object

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];
7 là một đối tượng giả mà chúng ta có toàn quyển kiểm soát, đối tượng này extends từ lớp đang liên quan đến unit test.

Stub Method

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];
8 là 1 phương thức được bao gồm bên trong 1
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];
7, phương thức này trả về null theo mặc định, nhưng có thể thay đổi dễ dàng.

Mock Method

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
5 cũng rất đơn giản, nó làm việc giống hoàn toàn với method ban đầu. Nói cách khác, mọi dòng code bên trong method mà bạn đang mocking sẽ được chạy và sẽ không trả về null theo mặc định [trừ khi method ban đầu trả về như thế].

Mark Nichols đưa ra một lời giải thích rất tốt về sự khác nhau giữa mock và stub method.

Nói một cách đơn giản,

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
1 rất có ích khi bạn muốn code bên trong nó chạy, nhưng cũng muốn thực hiện một số assertions theo hành vi của method. Ví dụ một số assertions như các tham số cụ thể được truyền vào method hoặc method đó được gọi chính xác 3 lần hoặc không được chạy lần nào.

Đừng lo lắng nếu nó không được rõ ràng ngay được.

4 cách dùng getMockBuilder[]

Chúng ta đã sử dụng PHPUnit API

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
7 nhưng bạn có biết, có 4 cách khác nhau để tạo object? Nó phụ thuộc hoàn toàn vào việc sử dụng method
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
8.

/**
 * Specifies the subset of methods to mock. Default is to mock none of them.
 *
 * @return MockBuilder
 */
public function setMethods[array $methods = null]
{
    $this->methods = $methods;
    return $this;
}
TH1: Không gọi method
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
8

Đây là cách đơn giản nhất:

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->getMock[];

Đoạn này sẽ tạo ra 1 mock object trong đó các method của nó:

  • Tất cả đều là stub,
  • Tất cả trả về null theo mặc định,
  • Dễ dàng override.
TH2: Truyền vào một mảng rỗng

Bạn có thể truyền vào một mảng rỗng cho method

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
8:

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];

Điều này sẽ tạo ra 1 mock object giống hoàn toàn với cách bạn không gọi method

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
8. Các method trong object này:

  • Tất cả đều là stub,
  • Tất cả trả về null theo mặc định,
  • Dễ dàng override.
TH2: Truyền vào một mảng rỗng

Bạn có thể truyền vào một mảng rỗng cho method

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
8:

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[null]
    ->getMock[];

Điều này sẽ tạo ra 1 mock object giống hoàn toàn với cách bạn không gọi method

$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[[]]
    ->getMock[];
8. Các method trong object này:

  • TH3: Truyền vào null
  • Bạn cũng có thể truyền vào
    $authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
        ->setMethods[null]
        ->getMock[];
    
    2:
  • Trường hợp này sẽ tạo ra 1 mock object, trong đó các methods:
Tất cả đều là mock,
$authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
    ->setMethods[['authorizeAndCapture', 'foobar']]
    ->getMock[];

Chạy code thực tế trong phương thức ban đầu khi được gọi,

  • Không cho phép override return value.

    • Tất cả đều là stub,
    • Tất cả trả về null theo mặc định,
    • Dễ dàng override.
  • TH2: Truyền vào một mảng rỗng

    • TH3: Truyền vào null
    • Bạn cũng có thể truyền vào
      $authorizeNet = $this->getMockBuilder[AuthorizeNetAIM::class]
          ->setMethods[null]
          ->getMock[];
      
      2:
    • Trường hợp này sẽ tạo ra 1 mock object, trong đó các methods:

Tất cả đều là mock,

Chạy code thực tế trong phương thức ban đầu khi được gọi,

Không cho phép override return value.

Chủ Đề