如何在单元测试中断言生成文件的内容
How to assert content of generated file in unit test
我有一个生成 csv 文件的功能,returns URL 可以下载该文件。问题是由于文件很多,我正在使用 Uuid::uuid4()->toString()
。我如何使用 Codeception 编写单元测试来验证给定函数是否有效?
测试要点:我必须将一个数组传递给函数来创建一个csv,函数returns带有数据的文件的路径,有必要检查函数returns 文件的正确路径。
是否可以检查文件是否包含某些信息,即数据导出的正确性,如果可以,如何做?
Class 测试:
class CsvExport
{
const UPLOAD_DIRECTORY = "uploads/csv/";
public function create(array $data): string
{
$id = Uuid::uuid4()->toString();
if (empty($data)) {
throw new \DomainException('Array is empty');
}
$file = $this->buildFileByPath($id);
$write = fopen($file, 'w+');
foreach ($data as $items) {
fputcsv($write, $items);
}
fclose($write);
return $file;
}
private function buildFileByPath(string $id): string
{
return self::UPLOAD_DIRECTORY . $id . '.csv';
}
}
我写测试失败的尝试:
class CsvExportTest extends Unit
{
/**
* @var UnitTester
*/
protected UnitTester $tester;
public function testCsvExport():void
{
$data = $data = [['Name', 'age', 'Gender']];
$service = new CsvExport();
$path = $service->create($data);
Assert::assertEquals($path, $service->create($data));
}
}
提前致谢!
您可以使用 PHPUnit 中的 assertStringMatchesFormatFile() 方法断言文件内容。
因此您的测试将如下所示:
public function testCsvExport(): void
{
$data = [['Name', 'age', 'Gender']];
$service = new CsvExport();
$path = $service->create($data);
Assert::assertStringMatchesFormatFile($path, 'Name,age,Gender');
}
通过这种方式,此单元测试将更有用,因为您可以确保文件确实已创建并且包含有效格式的数据。
由于您使用的是 Codeception,因此可以使用文件系统模块的 seeFileFound and seeFileContentsEqual 方法。
<?php
class CsvExportTest extends Unit
{
/**
* @var UnitTester
*/
protected UnitTester $tester;
public function testCsvExport():void
{
$data = [['Name', 'age', 'Gender']];
$service = new CsvExport();
$path = $service->create($data);
$this->tester->seeFileFound($path);
$this->tester->seeFileContentEquals("Name,age,Gender\n");
}
}
必须使用 composer require --dev codeception/module-filesystem
安装文件系统模块
并在套件配置中启用。
我有一个生成 csv 文件的功能,returns URL 可以下载该文件。问题是由于文件很多,我正在使用 Uuid::uuid4()->toString()
。我如何使用 Codeception 编写单元测试来验证给定函数是否有效?
测试要点:我必须将一个数组传递给函数来创建一个csv,函数returns带有数据的文件的路径,有必要检查函数returns 文件的正确路径。
是否可以检查文件是否包含某些信息,即数据导出的正确性,如果可以,如何做?
Class 测试:
class CsvExport
{
const UPLOAD_DIRECTORY = "uploads/csv/";
public function create(array $data): string
{
$id = Uuid::uuid4()->toString();
if (empty($data)) {
throw new \DomainException('Array is empty');
}
$file = $this->buildFileByPath($id);
$write = fopen($file, 'w+');
foreach ($data as $items) {
fputcsv($write, $items);
}
fclose($write);
return $file;
}
private function buildFileByPath(string $id): string
{
return self::UPLOAD_DIRECTORY . $id . '.csv';
}
}
我写测试失败的尝试:
class CsvExportTest extends Unit
{
/**
* @var UnitTester
*/
protected UnitTester $tester;
public function testCsvExport():void
{
$data = $data = [['Name', 'age', 'Gender']];
$service = new CsvExport();
$path = $service->create($data);
Assert::assertEquals($path, $service->create($data));
}
}
提前致谢!
您可以使用 PHPUnit 中的 assertStringMatchesFormatFile() 方法断言文件内容。
因此您的测试将如下所示:
public function testCsvExport(): void
{
$data = [['Name', 'age', 'Gender']];
$service = new CsvExport();
$path = $service->create($data);
Assert::assertStringMatchesFormatFile($path, 'Name,age,Gender');
}
通过这种方式,此单元测试将更有用,因为您可以确保文件确实已创建并且包含有效格式的数据。
由于您使用的是 Codeception,因此可以使用文件系统模块的 seeFileFound and seeFileContentsEqual 方法。
<?php
class CsvExportTest extends Unit
{
/**
* @var UnitTester
*/
protected UnitTester $tester;
public function testCsvExport():void
{
$data = [['Name', 'age', 'Gender']];
$service = new CsvExport();
$path = $service->create($data);
$this->tester->seeFileFound($path);
$this->tester->seeFileContentEquals("Name,age,Gender\n");
}
}
必须使用 composer require --dev codeception/module-filesystem
安装文件系统模块
并在套件配置中启用。