代码之家  ›  专栏  ›  技术社区  ›  byron perez

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

  •  1
  • byron perez  · 技术社区  · 6 年前

    我想了解为什么此函数在laravel中被调用两次,我定义了此工厂:

    <?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...
        }
    

    当我执行 单元测试 我得到以下错误

    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 回复  |  直到 6 年前
        1
  •  1
  •   Steve Chamaillard    6 年前

    首先,我们必须了解测试运行程序是如何工作的。

    即使每个测试都是以随机顺序运行的,但事实并非如此。而且,你必须明白这一点 setUp tearDown 总是 在每次测试之前和之后运行。

    设置 方法,如果应用程序未运行,它将刷新应用程序:

    if (! $this->app) {
        $this->refreshApplication();
    }
    

    ModelFactory 再说一遍,对吗?

    拆卸 方法,它实际上会在方法结束之前销毁应用程序:

    if ($this->app) {
        foreach ($this->beforeApplicationDestroyedCallbacks as $callback) {
            call_user_func($callback);
        }
    
        $this->app->flush();
        $this->app = null;
    }
    

    模型工厂 每次运行测试时都会包含该文件。但这发生在同一个PHP进程中。这就是为什么会出现已定义的函数错误。

    为了证明这很简单,只需在你的 文件:

    global $a;
    if (is_null($a)) {
        $a = 0;
    }
    else {
        $a++;
    }
    var_dump($a);
    

    你会看到的 $a 每次运行测试时递增。

    anonymous functions 像这样:

    $factory->define(App\Bien::class, function (Faker $faker) {
        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
        ];
    });