使用YAML文件作为PHPUnit(CIUnit)中的数据提供程序

时间:2012-05-17 05:20:18

标签: php codeigniter phpunit yaml

我正在使用PHP CodeIgniter Framework编写应用程序。我正在尝试使用CI_Unit,通过扩展PHPUnit来测试应用程序。为了测试模型,我试图加载PHPUnit文档中定义的YAML数据提供程序,我收到一个错误。如果我捏造数据提供者对象,我会收到另一个错误。如果我提供一个vanilla PHP数组,它会按预期运行。

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

如果我返回下面Yaml文件的对象PHPUnit_Extensions_Database_DataSet_YamlDataSet,我会得到:

  

数据集“客户”无效。

如果我循环PHPUnit_Extensions_Database_DataSet_YamlDataSet返回的对象并返回:我收到此错误:

  

PHPUnit_Framework_Exception:既不能打开“models.php”也不能打开“models.php”。在/Users/eric/pear/share/pear/PHPUnit/Util/Skeleton/Test.php第100行

如果我提供一个vanilla PHP数组,那么测试运行得很好。我用来运行测试的命令是:

  

phpunit models

以下是我的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,CodeIgniter 2.1.0以及与CI 2.1.0相关联的CI_unit。

编辑: 附件是我的models / 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;
}

2 个答案:

答案 0 :(得分:5)

Data Providers上的PHPUnit文档中所述:

  

数据提供程序方法必须为public并返回一个数组   数组或实现Iterator接口和yield的对象   每个迭代步骤的数组。对于作为其中一部分的每个数组   集合测试方法将被调用的内容   数组作为参数。

根据您的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文件无关紧要,据我所知,可以从您的问题中删除。

您也不需要PHPUnit测试方法中的try/catch块 - PHPUnit会为您处理。

请注意,您的$company_id未定义,因此我将其设置为0.您的方法参数&amp;上面的YAML数据似乎也没有完全匹配,但这应该很容易修复。

通过将数组传递给测试函数,该函数立即传递给add_client方法,您的代码也会更加干燥。

答案 1 :(得分:0)

PHPUnit Provider自动加载器

  

魔术助手,可在PHPUnit中自动加载CSV,JSON,PHP,XML和YAML数据提供程序。

安装

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 | yml}文件:

<?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 test自动加载YAML class providerYAML method provider