PHP中不存在的模拟接口

问题描述

我是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。