如何为使用 GDImage imagecreatefromstring 的函数编写 phpunit 测试

问题描述 投票:0回答:1

我正在为使用 GD 库创建图像的服务编写测试。在正常操作下,该方法运行以下内容不会出现问题:

imagecreatefromstring($this->imagick->getImageBlob());

在单元测试期间击中该行时,会出现错误:

Error: Call to undefined function App\Services\imagecreatefromstring()

如何让单元测试知道该方法来自哪里?

样品测试:

<?php

namespace Tests\Unit\Services;
use GDImage;

public function testReturnsError()
{
    // Arrange
    .. some arrangement


    Storage::shouldReceive('disk')
        ->with(self::SOURCE_DISK)
        ->andReturnSelf();

    Storage::shouldReceive('path')
        ->once()
        ->andReturn('123');

    // Act
    $image = $service->getImage('/path/here');

    // Assert
    ...some assertion
}

服务功能:

<?php

namespace App\Services;

use GdImage;
class SomeService
{
public function getImage(string $filePath): GdImage
{
    try {
        $decryptedFile = $this->decryptFile(Storage::disk(self::SOURCE_DISK)->path($filePath));

        $this->imagick->readImageBlob($decryptedFile);
        $this->imagick->setImageFormat('png');

        return imagecreatefromstring($this->imagick->getImageBlob());
    } catch (Exception $ex) {
       
    }
}
}
php unit-testing phpunit gd
1个回答
0
投票

命名空间的定义对我来说看起来不错。所以我将其排除为名称空间问题。

现在我假设您正在本地开发环境中运行测试。

我的猜测是,您正在与应用程序运行的 PHP 版本不同的 PHP 版本上运行测试,并且 PHP CLI 版本没有安装 GD。如果您在本地安装了 PHP,而不是通过 Docker 运行它,然后在 PHP 映像中运行测试,这是一个常见的错误。

创建一个info.php并将其放在与index.php同一目录中。然后使用 /phpinfo.php 调用您的应用程序。

<?PHP
phpinfo();

然后在本地计算机上打开终端或 CLI 并执行以下命令:

# Show version
php -v

如果 PHP 版本不相同,则需要将 PHP CLI 更新为应用程序的 PHP 版本。我至少建议这样做。

如果您使用安装LAMP环境的工具,通常可以并行安装多个版本的PHP。

如果两个版本相同,请检查 PHP CLI 包含哪些扩展。

# List auf modules
php -m

如果您仍然缺少 GD 等扩展,则必须为 PHP CLI 版本安装或激活它们。

© www.soinside.com 2019 - 2024. All rights reserved.