Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHPUnit测试中使用csv文件_Phpunit - Fatal编程技术网

如何在PHPUnit测试中使用csv文件

如何在PHPUnit测试中使用csv文件,phpunit,Phpunit,我按照PHPUnit手册的示例4.5编写了一个DataTest用例,url是:

我按照PHPUnit手册的示例4.5编写了一个DataTest用例,url是:
<但是我遇到了一个错误:

为DataTest::testAdd指定的数据提供程序无效。
数据集#0无效

我想可能是我以错误的方式编辑了data.csv文件,然后我使用php函数fputcsv()创建了data.csv文件,但它也不起作用,我想知道为什么,以及如何解决这个问题。谢谢

备注:data.csv中的数据是:

0,0,0
0,1,1


代码如下所示:
DataTest.php

require 'CsvFileIterator.php';
class DataTest extends PHPUnit_Framework_TestCase
{
public function provider()
    {
        return new CsvFileIterator('data.csv');
    }

    /**
    * @dataProvider provider
    */
    public function testAdd($a, $b, $c)
    {
         $this->assertEquals($c, $a + $b);
    }
}
CsvFileIterator.php

class CsvFileIterator implements Iterator
{
    protected $file;
    protected $key = 0;
protected $current;

public function __construct($file)
{
    $this->file = fopen($file, 'r');
}

public function __destruct()
{
    fclose($this->file);
}

public function rewind()
{
    rewind($this->file);
    $this->current = fgetcsv($this->file);
    $this->key = 0;
}

public function valid()
{
    return !feof($this->file);
}

public function key()
{
    return $this->key;
}

public function current()
{
    return $this->current;
}

public function next()
{
    $this->current = fgetcsv($this->file);
    $this->key++;
}
}
data.csv文件由函数fputcsv()创建:

示例:-)


@宗树林在这里也有类似的问题。可能的解决办法:

  • 看看这个。基本上,我必须在最后一行之后添加一行
  • 您还可以在指定data.csv位置时检查my
使用DIRECTORY_SEPARATOR常量使脚本可以在任何操作系统上运行——Windows使用反斜杠,而Linux使用斜杠


请显示数据提供程序函数的代码。这对于解释你在哪里犯了错误是很重要的。通过编辑将其添加到您的问题中(您可以缩短文件名和其他不重要的特定数据以了解您的问题)。@hakre,我已在我的问题中添加了代码,请帮助我分析并告诉我错误原因,谢谢!在构造函数中检查迭代器是否可以访问该文件。例如,您可能需要传递完整路径(例如
\uuuu DIR\uuu.'/data.csv'
)。或者,使用
true
作为使用include路径的选项。非常感谢您的回复,我再试了一次,效果很好。但我仍然有一个问题,为什么我不能使用
返回新的CsvFileIterator('csv文件名'),与示例4.5相同。[链接]@ZongshuLin这里也有类似的问题。选中此项,以及指定data.csv位置时的my。您的链接是用于审阅的断开链接;打补丁。
$data = array(
array(0, 0, 0),
array(0, 1, 1)
);

$fp = fopen('data.csv', 'w');

foreach($data as $v)
{
fputcsv($fp, $v);
}
fclose($fp);
/**
 * @dataProvider provider
 * @group csv
 */
public function testAdd($a, $b, $c)
{
    $this->assertEquals($c, $a + $b);
}

/**
 * @return array
 */
public function provider()
{
    $file = file_get_contents("/Volumes/htdocs/contacts.csv","r");
    foreach ( explode("\n", $file, -1) as $line )
    {
        $data[] = explode(',', $line);
    }
    return $data;
}

/*
 * CREATE TO CSV FILE DATAPROVIDER
 * don't create this file in your test case
 */
public function saveToCsv()
{
    $list = array(
        array(0,0,0),
        array(0,1,1)
    );

    $file = fopen("/Volumes/htdocs/contacts.csv","w");

    foreach ($list as $line)
    {
        fputcsv($file,$line);
    }

    fclose($file);
}
 /**
 * @return CsvFileIterator
 */
public function additionProvider()
{
    return new CsvFileIterator(__DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'storage/data.csv');
}