在我的Laravel 5.1应用程序的基础TestCase中扩展Illuminate\Foundation\Testing\TestCase
我有这种方法:
/**
* @beforeClass
*/
public function resetDatabase()
{
echo "I never see this message\n";
$this->artisan("migrate:refresh");
}
该类别中的其他@before和@after注释被视为广告。为什么在单元测试中没有调用此方法?
答案 0 :(得分:1)
对于仍在寻找可行解决方案的任何人,我都在Github上找到了这个特征:
<?php
namespace Tests;
use Illuminate\Support\Facades\Artisan;
trait MigrateFreshAndSeedOnce
{
/**
* If true, setup has run at least once.
* @var boolean
*/
protected static $setUpHasRunOnce = false;
/**
* After the first run of setUp "migrate:fresh --seed"
* @return void
*/
public function setUp() : void
{
parent::setUp();
if (!static::$setUpHasRunOnce) {
Artisan::call('migrate:fresh');
Artisan::call(
'db:seed',
['--class' => 'CompleteTestDbSeeder'] //add your seed class
);
static::$setUpHasRunOnce = true;
}
}
}
答案 1 :(得分:0)
事实证明所有注释都不相同!
检查vendor/phpunit/phpunit/src/Util/Test.php
节目:
private static function isBeforeClassMethod(ReflectionMethod $method)
{
return $method->isStatic() && strpos($method->getDocComment(), '@beforeClass') !== false;
}
private static function isBeforeMethod(ReflectionMethod $method)
{
return preg_match('/@before\b/', $method->getDocComment());
}
因此,如果我使函数静态,它将被识别并在类测试之前运行。 @before注释示例是所有实例方法,因此会导致混淆。