我似乎无法全神贯注于 phpunit 中的嘲笑。我有一个这样的测试,我尝试模拟我的 Curl 包装类“CurlRequest”的执行方法。
/** @test */
public function check_invalid_connection()
{
$mock = $this->getMockBuilder(CurlRequest::class)
->onlyMethods(['execute'])
->setConstructorArgs(["bla"])
->getMock();
$mock->method("execute")
->willThrowException(new Exception("Bla"));
$response = $this->json('POST', '/my-api-call');
}
在此 API 调用中执行以下代码
$req = new CurlRequest("any-url");
$req->setOption(CURLOPT_USERPWD,"user-password");
$req->setOption(CURLOPT_CUSTOMREQUEST, 'MLSD');
$req->setOption(CURLOPT_USERPWD, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
$response = $req->execute();
die($response);
我的期望是,模拟会导致在 ->execute 调用期间抛出异常。然而,这并没有发生。
我似乎找不到一个很好的例子,有人试图不直接调用他们刚刚创建的
$mock
的函数。
但是,构造函数参数似乎按预期工作 - 创建新实例时,它将有“bla”作为构造函数参数。
我认为这里的主要问题是您没有使用模拟组件(在您的示例中存储在
$mock
变量下)。看代码:
/** @test */
public function check_invalid_connection()
{
$mock = $this->getMockBuilder(CurlRequest::class)
->onlyMethods(['execute'])
->setConstructorArgs(["bla"])
->getMock();
$mock->method("execute")
->willThrowException(new Exception("Bla"));
$response = $this->json('POST', '/my-api-call');
}
$mock
没有机会被执行。您必须以某种方式重写您的逻辑,这将允许使用 $mock
而不是 new CurlRequest
。
这就是为什么“可测试性”经常被用作架构质量的衡量标准:如果它很容易测试 - 那么它可能组织得很好。
我可以建议你什么?最简单的方法是将
CurlRequest
作为参数传递给 json()
方法。然后在测试中,而不是 CurlRequest
的新实例,您将能够通过模拟。