Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHPUnit, mocked interfaces, and instanceof

Sometimes in my code, I'll check to see if a particular object implements an interface:

if ($instance instanceof Interface) {};

However, creating mocks of said interface in PHPUnit, I can't seem to pass that test.

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

I understand that having a class named Interface is different from a class implementing Interface, but I'm not sure how to get deal with this.

Am I forced to mock a concrete class that implements Interface? Wouldn't that defeat the purpose of using an interface for portability?

Thanks

like image 811
Bryan M. Avatar asked Jul 14 '10 21:07

Bryan M.


3 Answers

there is also assertInstanceOf as of 3.5.0

Example:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1));
like image 185
Brendon-Van-Heyzen Avatar answered Oct 12 '22 10:10

Brendon-Van-Heyzen


This works for me:

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

Maybe it's a typo or maybe $instance isn't what you think it is?

like image 20
martinvium Avatar answered Oct 12 '22 11:10

martinvium


Use PhpUnit function assertInstanceOf.

Example:

$this->assertInstanceOf(ResponseInterface::class, $signInResponse);
like image 21
Йося Гисем Avatar answered Oct 12 '22 11:10

Йося Гисем