Behat 3和Laravel,测试环境没有得到尊重


Behat 3 and Laravel, testing environment not being honoured

我在使用Behat 3和Laravel测试API时遇到了一个令人困惑的问题。

它似乎没有使用"测试"环境数据库(在我的情况下是sqlite内存数据库)。。。但只是一部分时间。

我在testing/database.php文件中放了一条日志消息,看看它何时加载。。运行Behat时,我确实看到了日志消息。

但是运行Behat功能是在我的开发数据库中添加行,我的一些测试也因为同样的原因而失败。

我的phpunit测试运行良好,不会更改开发数据库。

yml后面有什么东西我错过了吗?

编辑:我看到了问题-我正在使用Guzzle测试API,而Behat的设置函数正在测试环境中工作,一旦Guzzle在运行,应用程序就不知道它在测试环境中。所以我要么想办法告诉应用程序它在测试环境中,要么告诉behat使用开发环境。

使用PHPUnit,您可以在引导程序中配置环境,该配置将在整个测试过程中使用。使用Behat,您会遇到不同的情况,与PHPUnit不同,它向服务器发出请求,而不会直接与您的Php代码对话。尽管对我们这些开发人员来说,我们似乎正在测试位于功能下一个文件夹中的代码,但实际上,它是通过指向该代码的本地服务器访问的。换句话说,您正在处理一个远程代码,该代码对您的测试没有任何暴露,并且忽略(如预期的那样)配置(您无论如何都在本地代码上设置配置)。

因此,要将任何配置传递给代码,您需要将服务器视为入口点。有两种基本方法——为你的应用程序使用两个本地域(app.dev和app.tst),或者让你的app.tst接受一些参数/cookie,告诉它它正在测试中。第一种是最好的选择,因为您不需要向应用程序添加任何逻辑,并且可以通过服务器配置设置环境变量,或者使域指向不同的引导程序等。

FeatureContext.php中添加此方法:

/**
 * @BeforeSuite
 */
 public static function bootstrapLaravel()
 {
    $unitTesting = true;
    $testEnvironment = 'testing';

    require __DIR__ . '/../../../bootstrap/start.php'; // adjust this to right path. This will work if FeatureContext.php is in app/tests/acceptance
 }

这将使用测试数据库,并包括Laravel(因此您也可以使用您的模型)。