如何在PHPUnit中模拟带注释的方法?

时间:2019-07-18 19:05:06

标签: php phpunit aws-php-sdk phpunit-testing

我正在编写一个单元测试,我想检查方法publish()是否被调用了一次或多次。这是我整个测试课的摘录:

<?php

namespace App\Tests\Unit;

use Aws\Sns\SnsClient;
use Exception;
use PHPUnit\Framework\TestCase;

class MyClassTest extends TestCase
{
    /** @var SnsClient */
    private $snsClient;

    public function setUp(): void
    {
        $this->snsClient = $this->getMockBuilder(SnsClient::class)->disableOriginalConstructor()->getMock();
    }

    /**
     * @throws Exception
     */
    public function testNoCaseIdentifierSns()
    {
        $this->snsClient->expects($this->once())->method('publish')->with([
            [
                'doc_id' => 1,
                'bucket' => 'some_bucket',
                'key'    => 'test.tiff/0.png'
            ],
            'topic_arn'
        ]);
    }
}

但是当我运行上面的代码时,出现以下错误:

  

尝试配置无法配置的方法“发布”   因为它不存在,尚未指定,是最终的或是   静态

我想这里的问题是AWS中的方法定义为(请参见here):

* @method \Aws\Result publish(array $args = [])

可以模拟该方法吗?我在这里想念什么?

更新

在遵循注释建议之后,我将代码转换为以下代码:

$this->snsClient->expects($this->once())->method('__call')->with([
    'Message'  => json_encode([
        'doc_id' => 1,
        'bucket' => 'some_bucket',
        'key'    => 'test.tiff/0.png'
    ]),
    'TopicArn' => 'topic-arn'
]);

但是现在我遇到了另一个错误:

  

在调用1时,方法名的期望值等于'__call'失败   调用Aws \ AwsClient :: __ call('publish',   数组(...))与期望值不匹配。 “发布”不匹配   预期的类型为“数组”。

为什么? publish()方法签名是args

的数组

1 个答案:

答案 0 :(得分:3)

从引发的异常中,我们看到__call函数是用目标函数的名称(即“发布”)和包含所有参数的数组调用的。结果,这是如何更新模拟设置的方法:

$event = [
    'Message'  => json_encode([
        'doc_id' => 1,
        'bucket' => 'some_bucket',
        'key'    => 'test.tiff/0.png'
    ]),
    'TopicArn' => 'topic-arn'
];
$this->snsClient
    ->expects($this->once())
    ->method('__call')
    ->with('publish', [$event]);