2012-05-02 31 views
7

Tôi đang thử một đối tượng trả về một cá thể của một lớp khác. Bên trong, lớp đó gọi require_once. Tuy nhiên, khi tôi cố gắng để kiểm tra xem các đối tượng quay trở lại là loại tôi nhận được tin nhắn này:PHPUnit buộc tôi phải yêu cầu các lớp trước khi khẳng định ví dụ của

InvalidArgumentException: Argument #1 of PHPUnit_Framework_Assert::assertInstanceOf() must be a class or interface name 

Thông báo này sẽ biến mất khi tôi gọi require_once một lần nữa trong thử nghiệm của tôi trước khi cuộc gọi đến assertInstanceOf. Điều này có vẻ không đúng. Có vẻ như PHPUnit nên đủ thông minh để biết rằng lớp đã được tải, vì vậy tôi không nên tải lại nó. Tôi có nghĩ về điều này không? Tôi có cấu hình PHPUnit sai? Có cách nào để tránh yêu cầu lớp này một lần nữa trong bài kiểm tra của tôi không?

+0

là 'cái require_once' cần thiết trong lớp học riêng của mình, hoặc trong lớp tập tin, bên ngoài lớp nhưng nạp khi lớp tập tin được nạp? – Malovich

+0

'assertInstanceOf ('MyClass')' NOT 'assertInstanceOf (new MyClass)'. Hãy chắc chắn rằng bạn đang đi qua một chuỗi và không phải là một thể hiện của lớp. –

+0

Tôi đã vượt qua một chuỗi – Andrew

Trả lời

2

đơn vị của bạn có thể tương tự như sau:

$this->assertInstanceOf('MyOtherClass', 
    $this->object->someFunctionReturnsOtherClass()); 

Đây là ổn, ngoại trừ ở đây, Lưu ý: Phương pháp phpunit được gọi TRƯỚC đối tượng của bạn. Kể từ khi bạn nói, đối tượng của bạn đã nội bộ hiện một require_once phương tiện cho đến khi phương pháp của bạn đã được gọi là, 'MyOtherClass' vẫn là một lớp không xác định. Đó là chính xác những gì đã xảy ra. Chức năng Phpunit được chuẩn bị để kiểm tra bằng cách sử dụng 'MyOtherClass' và thấy nó không xác định!

Yêu cầu riêng của đối tượng require_once thậm chí không bao giờ được gọi. Đó là lý do tại sao bạn phải tự mình gọi điện trước. Nó tương tự nếu bạn sử dụng một câu lệnh như true == $returnObject instanceOf MyOtherClass sẽ trả về cùng một lỗi vì khi phân tích cú pháp PHP không tìm được định nghĩa lớp.

22

Hãy chắc chắn để sử dụng đầy đủ các không gian tên:

$this->assertInstanceOf('\Namespace\Subnamespace\MyClass', $obj); 
Các vấn đề liên quan