如何在单元测试中断言生成文件的内容

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 安装文件系统模块 并在套件配置中启用。