问题描述
我是PHP单元测试的新手,我需要弄清楚如何模拟不存在的接口。基本上,在我的项目中,我想测试一个受保护的方法,该方法期望有两个参数,一个是Interface,另一个是字符串。
我想了解如何在方法中将接口作为参数传递。我试图模拟该界面,但是对我来说不起作用。
这是我的主班
namespace App\Models;
class VerifyNs {
protected function NsCheck(SomeInterface $url,string $domain) {
$answer= dns_get_record($domain,DNS_NS);
if (!empty($answer[0]['target']),('example.com' == substr($answer[0]['target'],-11)) {
$result = 'NS verification for @url passed.,['@url ' => $url ->getName()]';
return $result
}
return 'Failed;
}
}
这是测试用例
class VerifyNsTest extends \PHPUnit\Framework\TestCase
{
/**
* To call protected method
* @param $object
* @param string $method
* @param array $parameters
* @return mixed
* @throws \Exception
*/
private function callMethod($object,string $method,array $parameters = [])
{
try {
$className = get_class($object);
$reflection = new \ReflectionClass($className);
} catch (\ReflectionException $e) {
throw new \Exception($e->getMessage());
}
$method = $reflection->getmethod($method);
$method->setAccessible(true);
return $method->invokeArgs($object,$parameters);
}
/**
* Tests for verifying NS of the domain.
*
* @dataProvider providerTestNsCheck
*/
public function testCheckNs($site,$url,$expected_result) {
$site_name = $this->getMockBuilder(SomeInterface::class)
->setMethods(['getName'])
->getMock();
$site_name->method('getName')->willReturn($site);
$verifyNs = new \App\Models\VerifyNs();
$this->assertEquals($expected_result,$this->callMethod($verifyNs,'NsCheck',[ $site_name,$url]));
}
/**
* Data provider for testCheckNs().
*
*/
public function providerTestNsCheck() {
return [
[
'mysite','example.com','NS verification for mysite passed.',],[
'google','google.com','Failed.'
]
],];
}
}
TypeError: Argument 1 passed to App\Models\VerifyNs::NsCheck() must be an instance of App\Models\SomeInterface,instance of Mock_SomeInterface_1ee04960 given
有人可以在这里帮忙吗?是否可以模拟non_existent接口并将其作为参数传递给方法?
解决方法
我能够使用prophesize解决此问题
$ site = $ this-> prophesize(SomeInterface :: class); $ object = $ site-> reveal()
然后在callMethod中传递$ object。