使用YAML文件作为PHPUnit中的数据提供者(CIUnit)(Using YAML Files

2019-09-17 07:10发布

我写使用PHP框架CodeIgniter的应用程序。 我想测试使用CI_Unit的应用程序,通过扩展PHPUnit的。 要测试模型,我想作为PHPUnit文档中定义加载YAML数据提供者,我收到一个错误。 如果我捏造数据提供程序对象,我得到另一个错误。 如果我提供它香草PHP阵列,它运行正常。

我究竟做错了什么? 什么是这样做的正确方法? 下面是我的结果:

如果我返回对象PHPUnit_Extensions_Database_DataSet_YamlDataSet低于YAML文件,我得到:

数据集“客户”是无效的。

如果周围返回的对象我环路PHPUnit_Extensions_Database_DataSet_YamlDataSet并返回:我得到这个错误:

PHPUnit_Framework_Exception:既不是“models.php”,也不是“models.php”可以打开。 在/Users/eric/pear/share/pear/PHPUnit/Util/Skeleton/Test.php上线100

如果我提供它香草PHP阵列,测试运行就好了。 我用它来运行测试的命令是:

PHPUnit的车型

下面是我的YAML文件的例子。

Clients:
    1:
        client_id: 1
        client_information: "info number 1"
        client_key: 48fb10b15f3d44a09dc82d
    2:
        client_id: 2
        client_information: "info number 2"
        client_key: 48fb10b15f3d44addd

我使用PHP 5.3,PHPUnit的3.6.10,DBUnit的1.1.2,2.1.0笨,并与CI 2.1.0关联CI_unit。

编辑:附件是我的模型/ test.php的文件:

/**
 * test_add_client
 * @dataProvider add_client_provider
 */
public function test_add_client($client_id,$company_id,$software_id,$client_information,$client_key)
{
    $data = array('software_id' => $software_id,
                  'client_information' => $client_information,
                  'client_key'         => $client_key);
    try {
        $id = $this->_m->add_client($company_id,$data);
        $this->assertEquals(true, is_int($id));
    } catch (Exception $e){
        $this->assertEquals(true,false);
    }
}

public function add_client_provider()
{
    $result = new PHPUnit_Extensions_Database_DataSet_YamlDataSet(
        dirname(__FILE__)."/../fixtures/Clients.yml");

    // Case #1 returns this $result
    //return $result;

    foreach($result as $key => $value){
        if($key == 'Clients'){
            $substructure = $value;
        }
    }

    // Case #2 return the inner structure that is the table
    return $substructure;

    // Case #3 return an array of arrays
    $data = array(
                array(1,1,1,'test','text 2'),
                array(1,2,1,'test 3', 'test 3'));
    return $data;
}

Answer 1:

作为对PHPUnit文档中描述的数据提供者 :

一种数据提供者的方法必须是public的,而且返回数组的数组或实现该对象Iterator接口和每次迭代产生步骤的阵列。 对于每个是集试验方法将与数组作为其参数的内容被称为的一部分阵列。

根据您的Test.php源代码,看来你想是这样的:

    /**
     * test_add_client
     * @dataProvider add_client_provider
     */
    public function test_add_client($data)
    {
        $company_id = 0;
        $id = $this->_m->add_client($company_id, $data);
        $this->assertEquals(true, is_int($id));
    }

    public function add_client_provider()
    {
        $result = new PHPUnit_Extensions_Database_DataSet_YamlDataSet(
            dirname(__FILE__)."/../fixtures/Clients.yml");          

        // Return the Clients data
        $clients = array();
        $tbl = $result->getTable('Clients');
        for ($i = 0; $i < $tbl->getRowCount(); $i++) {
            $clients[] = $tbl->getRow($i);
        }
        return $clients;
    }

似乎PHPUnit的应该提供一个函数把数据集表直接到数组的数组,但我看一眼后,什么也没看见。

phpunit.xml文件是无关紧要的,并且可以从你的问题,据我可以告诉被删除。

你也不需要try/catch在PHPUnit的测试方法块- PHPUnit的会照顾的,对于你。

请注意,您的$company_id没有定义,所以我只是将它设置为0。您的方法参数和YAML以上数据似乎并不匹配完全上述任一,但应该是很容易解决。

通过传递一个数组中的测试功能,它被立即传递给add_client方法,你的代码是有点多干为好。



Answer 2:

PHPUnit的提供商自动加载磁带机

魔术帮手自动加载CSV,JSON,PHP,XML和YAML数据提供商PHPUnit中。

安装目录

composer require redaxmedia/phpunit-provider-autoloader

用法

创建您的测试套件TestCaseAbstract:

<?php
namespace ExampleProject\Tests;

use PHPUnitProviderAutoloader;

/**
 * TestCaseAbstract
 *
 * @since 2.0.0
 *
 * @package ExampleProject
 * @category Tests
 */

abstract class TestCaseAbstract extends PHPUnitProviderAutoloader\TestCaseAbstract
{
    /**
     * directory of the provider
     *
     * @var string
     */

    protected $_providerDirectory = 'tests' . DIRECTORY_SEPARATOR . 'provider';

    /**
     * namespace of the testing suite
     *
     * @var string
     */

    protected $_testNamespace = __NAMESPACE__;
}

从扩展到TestCaseAbstract的自动加载{ExampleTest _testMethod} {CSV | JSON | PHP | XML |阳明}文件:

<?php
namespace ExampleProject\Tests;

/**
 * ExampleTest
 *
 * @since 2.0.0
 *
 * @package ExampleProject
 * @category Tests
 */

class ExampleTest extends TestCaseAbstract
{
    /**
     * testMethod
     *
     * @since 2.0.0
     *
     * @param string $expect
     *
     * @dataProvider providerAutoloader
     */

    public function testMethod(string $expect = null)
    {
        $this->assertEquals($expect, 'test');
    }
}

阅读更多

相关资料库: https://github.com/redaxmedia/phpunit-provider-autoloader

实施例集成: YAML测试自动加载YAML类提供商和YAML方法提供商



文章来源: Using YAML Files as data provider in PHPUnit (CIUnit)