【问题标题】:How to assert content of generated file in unit test如何在单元测试中断言生成文件的内容
【发布时间】:2021-02-04 18:27:01
【问题描述】:

我有一个函数可以生成 csv 文件并返回下载文件的 URL。问题是由于文件很多,我正在使用Uuid::uuid4()->toString()。如何使用 Codeception 编写单元测试来验证给定函数是否有效?

测试的本质:我必须将一个数组传递给函数来创建一个csv,函数返回带有数据的文件的路径,需要检查函数返回的文件路径是否正确。

是否可以检查文件是否包含某些信息,即数据导出的正确性,如果是,如何进行?

要测试的类:

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));
    }

}

提前致谢!

【问题讨论】:

  • 请分享更多细节 - 你想测试什么? CSV 文件是否包含某些内容?也许 Flysystem 可以帮你抽象文件系统
  • 我应您的要求补充了问题
  • 也想一想,真的是你要测试的返回路径吗?这告诉你什么?就其本身而言,它不会告诉您文件是否使用正确的内容创建,这似乎是该功能的主要目标。该路径实际上由 $this->buildFileByPath($id); 处理,您可以自行测试。
  • 如何查看文件内容?
  • 为什么不打开文件阅读一下?

标签: php unit-testing codeception


【解决方案1】:

您可以使用 PHPUnit 中的 assertStringMatchesFormatFile() 方法声明文件内容。

所以您的测试将如下所示:

public function testCsvExport(): void
{
    $data = [['Name', 'age', 'Gender']];

    $service = new CsvExport();
    $path = $service->create($data);

    Assert::assertStringMatchesFormatFile($path, 'Name,age,Gender');
}

通过这种方式,这个单元测试会更有用,因为您可以确保文件是真正创建的并且它包含有效格式的数据。

【讨论】:

    【解决方案2】:

    由于您使用的是 Codeception,您可以使用 Filesystem 模块的 seeFileFoundseeFileContentsEqual 方法。

    <?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 安装 并在套件配置中启用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 2011-03-15
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多