我正在为使用 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 版本不同的 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 版本安装或激活它们。