使用Behat 3和Laravel设置包迁移

时间:2014-08-19 16:15:21

标签: php laravel behat

我正在努力将Behat 3纳入基于Laravel的新API,并且我使用lucadegasperi / oauth2-server-laravel包来处理身份验证。

有时间让Behat设置正常工作(现在是)。我不明白为什么,但似乎我需要在beforeSuite和beforeFeature钩子中迁移包。看起来很傻,因为我只需要在所有功能运行之前迁移一次..?

我想在套件加载之前只迁移一次,否则随着测试次数的增加,运行时间可能会变长。

我一直在攻击Behat 2 *的示例,以便在第3版中工作。

我的FeatureContext类目前看起来像这样:

use Behat\Behat\Context\SnippetAcceptingContext;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;

/**
 * Behat context class.
 */
class FeatureContext implements SnippetAcceptingContext
{

    private $_restObject        = null;
    private $_restObjectType    = null;
    private $_restObjectMethod  = 'get';
    private $_client            = null;
    private $_response          = null;
    private $_requestUrl        = null;

    private $_baseUrl           = null;

    /**
     * Initializes context.
     *
     * Every scenario gets its own context object.
     * You can also pass arbitrary arguments to the context constructor through behat.yml.
     */
    public function __construct($baseUrl)
    {
        $this->_restObject  = new stdClass();
        $this->_client      = new GuzzleHttp\Client();
        $this->_baseUrl = $baseUrl;
    }

    /**
    * @static
    * @beforeSuite
    */
    public static function bootstrapLaravel()
    {
        $unitTesting = true;
        $testEnvironment = 'testing';
        // This assumes the FeatureContext.php class is within app/tests/features/bootstrap
        $app = require_once __DIR__.'/../../../../bootstrap/start.php';

        $app->boot();

        Mail::pretend(true);
    }

    /**
    * @static
    * @beforeSuite
    */
    public static function setUpDb()
    {
        Artisan::call('migrate');

        self::migratePackages();

        /* do seeding */
        $seeders = array(
            "OAuthTestSeeder",
            "RolesPermissionsSeeder"
        );

        foreach ($seeders as $seedClass)
        {
            Artisan::call("db:seed", array("--class" => $seedClass));
        }        
    }
    /**
    * @static
    * @beforeFeature
    */
    public static function prepDb()
    {
        Artisan::call('migrate:refresh');
        self::migratePackages();

        Artisan::call('db:seed');


    }

    public static function migratePackages() 
    {
        $packages = array(
            "lucadegasperi/oauth2-server-laravel",
        );        

        foreach ($packages as $packageName)
        {
            Artisan::call("migrate",
                array("--package" => $packageName, "--env" => "testing"));
            echo 'migrating package: '.$packageName;
        }   

    }
/* feature specs here... 
*/ 
}

1 个答案:

答案 0 :(得分:2)

是的,文档和示例不是Behat最强大的部分,但不要害怕。与其他一些测试软件不同,当你加载整个东西时,Behat没有为你提供运行引导程序的单一选项,尽管它提供了许多其他很酷的功能。你几乎走在正确的道路上。您需要做的就是有一个静态标志,指示引导程序是否完成了工作。在我的例子中,我通过添加存储状态值的TestUtility类和每个上下文中包含的SetUpTrait来完成这项工作。

final class TestUtility extends AbstractUtility
{

    protected static $bootstrapped = false;

    public static function isBootstrapped()
    {
        return self::$bootstrapped;
    }

    public static function bootstrap()
    {
        if (self::isBootstrapped()) {
            return;
        }

        include_once(__DIR__ . './../bootstrap.php');
        self::$bootstrapped = true;
    }
}

trait SetUpTrait
{

    public static function setUpSuite(BeforeSuiteScope $scope)
    {
        TestUtility::bootstrap();
    }
}

class My extends RawMinkContext
{
    use SetUpTrait;
}

我设法为应用程序本身,PHPUnit和Behat测试设置应用程序以使用单个引导程序文件。它带有一些额外的代码行,但是所有内容都有一个条目,并且它非常容易维护 - 比使用3个引导文件更容易。