我尝试在 Symfony 中使用 PHPUnit 来测试返回调整大小的图像的方法。理想情况下,我能够在图像对象中进行模拟并设置一些尺寸,然后查看返回时尺寸是否发生变化。
代码使用 Imagick 并解码图像,我想知道这是否意味着我将被迫在服务器上保留测试图像以进行单元测试?有没有办法为此目的在代码中模拟图像文件?
$based = base64_decode($content);
if($based){
$content = $based;
}
$imagick = new \Imagick();
$imagick->readImageBlob($content);
如果要将该文件存储在服务器上进行测试,我将如何模拟请求对象以包含该文件?
我设法找到将文件传递给 Imagick 的正确方法。它需要
file_get_contents
包裹在 base64_encode
中
public function setUp(){
$imagePath = getcwd()."/src/Woodwork/PartnerBundle/Tests/lin.png";
$this->image = base64_encode(file_get_contents($imagePath));
$logger = $this->getMockBuilder('Logger')->setMethods(array('debug', 'info', 'error'))->getMock();
$this->imagickHelper = new ImagickHelper($logger);
}
最好的方法是模拟 Imagick,然后通过
readImage
方法添加文件。这是一个例子:
class MyClass {
public function __construct(
private Imagick $imagick = new Imagick()
)
public function doSomething(string $filename)
{
$this->imagick->readImage($filename);
# And blabla...
}
}
现在测试:
class MyClassTest extends TestCase {
public function testShouldDoSomething()
{
$imagick = $this->createMock(Imagick::class);
$imagick->method('readImage')->willReturn(true);
# And blabla...
}
}