从Behat / Mink FeatureContext中使用Laravel Eloquent

时间:2019-03-05 22:28:27

标签: php laravel selenium behat mink

这个问题假设您对Laravel,Behat和Mink有一定了解。

考虑到这一点,我在从Behat FeatureContext文件中进行简单的数据库调用时遇到麻烦,该文件看起来像这样...

<?php

use App\Models\Db\User;
use Behat\Behat\Context\Context;
use Behat\Gherkin\Node\PyStringNode;
use Behat\Gherkin\Node\TableNode;
use Behat\MinkExtension\Context\MinkContext;

/**
 * Defines application features from the specific context.
 */
class FeatureContext extends MinkContext implements Context {
    public function __construct() {}

    /**
     * @Given I am authenticated with :email and :password
     */
    public function iAmAuthenticatedWith($email, $password) {
        User::where('email', $email)->firstOrFail();

        $this->visitPath('/login');
        $this->fillField('email', $email);
        $this->fillField('password', $password);
        $this->pressButton('Login');
    }
}

在这种情况下运行时,我会收到此错误...

Fatal error: Call to a member function connection() on null (Behat\Testwork\Call\Exception\FatalThrowableError)

这是由这条线引起的...

User::where('email', $email)->firstOrFail();

如何在Behat / Mink FeatureContext中使用Laravel Eloquent(进行数据库调用)?我是否需要在FeatureContext的构造函数中公开某些内容?更新/添加composer.jsonbehat.yml文件中的一行?

如果有多种方法可以解决此问题,那么值得一提。

其他详细信息

  • Laravel:5.5.*

  • 注意:^3.3

  • Mink扩展名:^2.2

  • Mink Selenium 2驱动程序:^1.3

Behat Config

default:
  extensions:
    Behat\MinkExtension\ServiceContainer\MinkExtension:
      base_url: "" #omitted 
      default_session: selenium2
      selenium2:
        browser: chrome

1 个答案:

答案 0 :(得分:2)

Laravel需要设置雄辩的语言和能力,才能正常工作。

最简单的方法是扩展laravel TestCase并在__constructor()调用parent::setUp();

它将像在Laravel中运行php测试单元时一样设置您的测试环境:

    /**
     * Setup the test environment.
     *
     * @return void
     */
    protected function setUp()
    {
        if (! $this->app) {
            $this->refreshApplication();
        }
        $this->setUpTraits();
        foreach ($this->afterApplicationCreatedCallbacks as $callback) {
            call_user_func($callback);
        }
        Facade::clearResolvedInstances();
        Model::setEventDispatcher($this->app['events']);
        $this->setUpHasRun = true;
    }

refreshApplication()将调用createApplication(),它会引导Laravel并创建$this->app对象。

    /**
     * Refresh the application instance.
     *
     * @return void
     */
    protected function refreshApplication()
    {
        $this->app = $this->createApplication();
    }