我正在编写一个单元测试,我想检查方法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
答案 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]);