加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 16:09:31 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试为使用全局参数(来自YML文件)的服务编写测试. 我正在setUp()方法中检索这些参数,但是当我尝试在@dataProvider中使用它们时,它会抛出一个错误. class InterpreterServiceTest extends KernelTestCase{ private $container; private $service; priva
我正在尝试为使用全局参数(来自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方法中获取所有数据(包括服务obj)

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;
    }
}

为什么:

setUp和setUpBeforeClass方法都在PHPUnit_Framework_TestSuite类的run方法中运行.但是,dataProvider中的数据先前作为createTest函数的一部分计算.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读