关于Laravel testcase方法的@beforeClass注释被忽略

时间:2016-07-14 07:31:01

标签: laravel annotations phpunit

在我的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注释被视为广告。为什么在单元测试中没有调用此方法?

2 个答案:

答案 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注释示例是所有实例方法,因此会导致混淆。