gpt4 book ai didi

php - 使用 PHP 匿名类进行测试和模拟

转载 作者:行者123 更新时间:2023-12-01 23:30:52 25 4
gpt4 key购买 nike

我正在尝试使用匿名类测试和模拟一段代码。这是代码:

<?php

namespace App\Service;

use Symfony\Contracts\HttpClient\HttpClientInterface;

class FetchPromoCodeService
{
private $client;

public function __construct(HttpClientInterface $client)
{
$this->client = $client;
}

public function getPromoCodeList(): array
{
$response = $this->client->request(
'GET', 'https://xxxxxxxxx.mockapi.io/test/list'
);

return $response->toArray();
}
}

这是我的测试类:

<?php

namespace App\Tests\Service;

use App\Service\FetchPromoCodeService;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\JsonResponse;

class FetchPromoCodeServiceTest extends TestCase
{

public function testGetPromoCodeList()
{
$fetchPromoCodeService = new class () extends FetchPromoCodeService {
public $client;

public function __construct($client)
{
$this->client = (new JsonResponse(['a' => 1, 'b' => 2]))->getContent();
parent::__construct($client);
}
};

$result = $fetchPromoCodeService->getPromoCodeList();

$this->assertIsArray($result);
}
}

我需要测试 getPromoCodeList() 方法,所以我想模拟 http 调用。测试的目的是确保我们将结果调用转换为 php 数组。

但我的问题是 FetchPromoCodeService 构造函数。我在执行命令时出现此错误。

ArgumentCountError: Too few arguments to functionclass@anonymous::__construct(), 0 passed in/var/www/html/tests/Service/FetchPromoCodeServiceTest.php online 14 and exactly 1 expected

我知道它正在等待 HttpClientInterface 类型的参数,但我知道有一种方法可以覆盖它,因为我只想模拟 client 属性。我只是不记得我该怎么做。

我如何在 php 和匿名类中做到这一点?

最佳答案

虽然您可以使用匿名类实现您想要的,但 Symfony HTTP 客户端附带的模拟客户端可能是更简单的解决方案:

<?php

namespace App\Tests\Service;

use App\Service\FetchPromoCodeService;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpClient\MockHttpClient;
use Symfony\Component\HttpClient\Response\MockResponse;

final class FetchPromoCodeServiceTest extends TestCase
{
public function testGetPromoCodeList()
{
$client = new MockHttpClient([new MockResponse(json_encode(['a' => 1, 'b' => 2]))]);

$result = (new FetchPromoCodeService($client))->getPromoCodeList();

self::assertIsArray($result);
}
}

关于php - 使用 PHP 匿名类进行测试和模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66286664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com