PHP / Laravel:为什么要调用此函数?

时间:2018-11-14 20:27:04

标签: php laravel function callback

我想了解为什么在laravel中两次调用了此函数,我定义了这个Factory:

<?php

use Faker\Generator as Faker;

function my_callback (Faker $faker) { // <= LINE 5 
    return [
        // some key-value pairs, don't focus on that
        'id_ubicacion' => 1,
        'nombre' => $faker->name,
        'clase' => 'CONTROL ADMINISTRATIVO',
        'codigo' => $faker->ean13,
        // some other key-value pairs
    ];
} // <= LINE 29

$factory->define(App\Bien::class, 'my_callback');

然后,我进行以下测试:

<?php

namespace Tests\Unit;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

use Faker\Factory as Faker;

class BienTest extends TestCase
{
    use RefreshDatabase;

    public function test__actualizar()
    {
        // setup
        $registro_a_actualizar = factory('App\Bien')->create(['id' => 1]);

        // more code...

    }

    public function test__destruir()
    {
        // setup
        $registro_a_destruir = factory('App\Bien')->create(['id' => 1]);

        // some code...
    }

当我执行     phpunit 我收到以下错误

Fatal error: Cannot redeclare my_callback() 

(previously declared in \inven\database\factories\FactoryBien.php:5) 

in \inven\database\factories\FactoryBien.php on line 29

感谢您能解释一下我:为什么多次调用函数my_callback()

1 个答案:

答案 0 :(得分:1)

首先,我们必须了解测试运行器的工作方式。

即使每个测试都是按照随机顺序运行的,但事实并非如此。另外,您还必须了解,INFO: Creating Resource(id=host-manager/jdbc/mcbell) Nov 14, 2018 3:17:11 PM org.apache.openejb.assembler.classic.Assembler unusedProperty WARNING: Property "factory" not supported by "host-manager/jdbc/mcbell" setUp在每次测试之前和之后都始终运行。

在Laravel的tearDown方法中,如果应用未运行,它将刷新应用:

setUp

所以我们可能会想,我们正在保持一个应用程序实例的运行,所以我们不应该再次要求if (! $this->app) { $this->refreshApplication(); } ,对吗?

错误

在每次测试后调用的ModelFactory方法中,它实际上会在方法结束之前立即销毁应用程序:

tearDown

这意味着您每次运行测试都会包含您的if ($this->app) { foreach ($this->beforeApplicationDestroyedCallbacks as $callback) { call_user_func($callback); } $this->app->flush(); $this->app = null; } 文件。但这是在同一PHP过程中发生的。这就是为什么您会收到一个已定义的函数错误的原因。

要证明这很容易,只需将其写到ModelFactory文件中即可:

ModelFactory

每次运行测试时,您都会看到global $a; if (is_null($a)) { $a = 0; } else { $a++; } var_dump($a); 递增。

要解决您的问题,您应该像这样简单地使用anonymous functions

$a