PHP单元测试闭包函数



我在我的应用程序中执行单元测试,其中一些函数包括闭包函数,如下所示:

<?php
namespace JobProgressTransformers;
use LeagueFractalTransformerAbstract;
class CustomersTransformer extends TransformerAbstract {

public function includesCreatedBy($customer) {
$user = $customer->createdBy;
if($user) {
return $this->item($user, function($user){
Log::info('unit test');
return [
'id'               => (int)$user->id,
'first_name'       => $user->first_name,
'last_name'        => $user->last_name,
'full_name'        => $user->full_name,
'full_name_mobile' => $user->full_name_mobile,
'company_name'     => $user->company_name,
];
});
}
}
}

注意:我已经扩展了TransformerAbstract类的Fractal,并使用item函数作为TransformerAbstract类中的$this->item。

下面是我如何执行我的测试:

public function testIncludeDeletedBy() {
$customer = factory(Customer::class)->create();
$include = $this->transformer->includesCreatedBy($customer);
$object = $include->getData()->first();
$this->assertInstanceOf(User::class, $object);
}
我的单元测试没有执行我在闭包函数中编写的代码。就像我在上面的代码中提到的,我添加了一些日志,但是我的单元测试没有执行那部分代码。

有谁能帮帮我吗

这可能与$this->item()方法的实现细节有关。您可能期望闭包被执行,而正如我们所看到的,闭包只需要被解析,然后作为参数传递给方法。

代码没有显示任何实际执行的内容,因此您不应该期望它是,因为它是不在测试范围内的实现细节。

你可以去匿名化闭包,并直接调用它,以便作为一个单元来测试它。

所以你有一个测试的if-子句在现有的方法和一个测试允许你运行(不仅仅是解析)你目前有一个匿名函数/闭包的代码。

这有时被称为测试点,可以提高您的速度。你拥有的单元越小,测试它们就越容易。

<?php
namespace JobProgressTransformers;
use LeagueFractalTransformerAbstract;
class CustomersTransformer extends TransformerAbstract {

public function includesCreatedBy($customer) {
$user = $customer->createdBy;
if($user) {
return $this->item($user, $this->transformImplementation(...));
}
}
public function transformImplementation(object $user) {
Log::info('unit test');
return [
'id'               => (int)$user->id,
'first_name'       => $user->first_name,
'last_name'        => $user->last_name,
'full_name'        => $user->full_name,
'full_name_mobile' => $user->full_name_mobile,
'company_name'     => $user->company_name,
];
}
}

对于三个点(...),这是PHP 8.1的语法,比较PHP RFC:一级可调用语法在8.1之前的可调用的PHP语法,例如:

Closure::fromCallable([$this, 'transformImplementation'])

最新更新