2010-07-14 34 views
33

Đôi khi trong mã của tôi, tôi sẽ kiểm tra để xem nếu một đối tượng cụ thể thực hiện một giao diện:PHPUnit, giao diện chế giễu, và instanceof

if ($instance instanceof Interface) {}; 

Tuy nhiên, tạo mocks của giao diện nói trong PHPUnit, tôi không thể dường như vượt qua bài kiểm tra đó.

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

Tôi hiểu rằng có một lớp có tên Giao diện khác với giao diện triển khai lớp, nhưng tôi không chắc chắn cách giải quyết vấn đề này.

Tôi có bị buộc phải giả lập một lớp cụ thể triển khai Giao diện không? Điều đó sẽ không đánh bại mục đích của việc sử dụng một giao diện cho tính di động?

Cảm ơn

Trả lời

38

này làm việc cho tôi:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

Có lẽ đó là một lỗi đánh máy hoặc có thể $ dụ được không phải những gì bạn nghĩ rằng đó là?

+12

Yep, Thủ trưởng mát ưu tiên áp dụng. Sau một đêm ngủ đầy đủ, tôi nhận ra rằng tôi đã không sử dụng không gian tên đầy đủ khi chế nhạo đối tượng. –

+0

Trường hợp sử dụng khác nhau một chút, nhưng tôi có thể kiểm tra xem một cá thể có phải là một cá thể của một lớp hay một mô hình của lớp đó không. – kapad

+0

@kapad Bạn thấy đấy, đây là điểm chính của Đa hình mà bạn không cần phải biết nếu đối tượng hiện tại là và thể hiện của lớp hay một mô hình. Nếu bạn vẫn cần phải biết, sau đó bạn làm điều gì đó sai trái. P.S. Chỉ cần thông tin bạn có thể sử dụng hàm [get_class] (http://ca1.php.net/manual/en/function.get-class.php) để biết tên lớp chính xác của đối tượng – dVaffection

47

cũng có assertInstanceOf như của 3.5.0

Ví dụ:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_This_ được đề xuất cách kiểm tra loại. – stefgosselin

+1

Ngoài câu trả lời @stefgosselin, đây là cách được khuyến khích kiểm tra loại, vì bạn nhận được thông báo lỗi tốt hơn, tự giải thích. So sánh '' 'không xác nhận rằng đối tượng là instance của Class''' thành' '' không xác nhận rằng false là true'''. –

+2

Kể từ PHP 5.5, bạn có thể sử dụng '\ Models \ User :: class' thay vì' '\ Models \ User'', điều này làm cho việc tái cấu trúc trở nên dễ dàng hơn nhiều. –

Các vấn đề liên quan