gpt4 book ai didi

php - 在 PHPUnit 数据提供程序中设置和使用参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:30 26 4
gpt4 key购买 nike

我正在尝试为使用全局参数(来自 YML 文件)的服务编写测试。

我在 setUp() 方法中检索这些参数,但是当我尝试在 @dataProvider 中使用它们时,它会抛出错误。

class InterpreterServiceTest extends KernelTestCase
{
private $container;
private $service;
private $citiesMap;

public function setUp()
{
self::bootKernel();
$this->container = self::$kernel->getContainer();
$this->service = $this->container->get('geolocation.interpreter');
$this->citiesMap = $this->container->getParameter("citiesmap");
self::tearDown();
}

/**
* @dataProvider locationsProvider
*/
public function testCompanyCityFromCity($location, $expected)
{
$city = $this->service->getCompanyCityFromCity($location);
$this->assertEquals($expected, $city);
}

public function locationsProvider()
{
$return = array();
foreach ($this->citiesMap as $area) {
$return[] = [
$area['external_service_area'],
$area['company_area']
];
}
return $return;
}
}

Invalid argument supplied for foreach()

如果我手动编写 locationsProvider() 的返回值,它会起作用

return [
["Barcelona", "Barcelona"],
["Madrid", "Madrid"],
["Cartagena", "Murcia"]
];

我还检查了 setUp() 中的 foreach,它返回了正确的预期数组。


@dataProvider 似乎在 setUp() 方法之前执行。

有没有其他方法可以做到这一点?

最佳答案

担心您必须在 dataProvider 方法中获取所有数据(包括服务对象)

TL&DR 应该这样做:

class InterpreterServiceTest extends KernelTestCase
{
/**
* @dataProvider locationsProvider
*/
public function testCompanyCityFromCity($service, $location, $expected)
{
$city = $service->getCompanyCityFromCity($location);

$this->assertEquals($expected, $city);
}

public function locationsProvider()
{
self::bootKernel();

$container = self::$kernel->getContainer();
$service = $this->container->get('geolocation.interpreter');
$citiesMap = $this->container->getParameter("citiesmap");
// self::tearDown(); - depends on what is in the tearDown

$return = array();
foreach ($citiesMap as $area) {
$return[] = [
$service,
$area['external_service_area'],
$area['company_area']
];
}

return $return;
}
}

原因:

setUpsetUpBeforeClass 方法都在PHPUnit_Framework_TestSuite 类的run 方法中运行。但是,作为 createTest 函数的一部分,来自 dataProvider 的数据是较早计算的。

关于php - 在 PHPUnit 数据提供程序中设置和使用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410734/

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