我想了解为什么在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()
?
答案 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