【问题标题】:Mock Non-existent Interface in PHP在 PHP 中模拟不存在的接口
【发布时间】:2020-12-07 02:04:55
【问题描述】:

我是 PHP 单元测试的新手,我需要了解如何模拟不存在的接口。基本上,在我的项目中,我想测试一个受保护的方法,它需要两个参数,一个是接口,另一个是字符串。

我想了解如何在方法中将接口作为参数传递。我试图模拟界面,但它不适合我。

这是我的主要课程


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 接口并将其作为参数传递给方法?

【问题讨论】:

  • “不存在的接口”是什么意思?您的测试用例是否包含SomeInterface 的正确使用语句?
  • 是的,确实如此。基本上接口在另一个文件中很复杂,所以我想在测试用例中创建实际的接口,并将其作为参数传递给方法。

标签: php drupal mocking phpunit


【解决方案1】:

我能够使用 prophesize 解决此问题

$site = $this->prophesize(SomeInterface::class); $object =$site->reveal()

然后在 callMethod 中传递 $object。

【讨论】:

    猜你喜欢
    • 2013-01-30
    • 2013-10-29
    • 2017-07-16
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多