如何在测试执行期间模拟实例化类的类函数

问题描述 投票:0回答:1

我似乎无法全神贯注于 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”作为构造函数参数。

php phpunit
1个回答
0
投票

我认为这里的主要问题是您没有使用模拟组件(在您的示例中存储在

$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
的新实例,您将能够通过模拟。

© www.soinside.com 2019 - 2024. All rights reserved.