Используйте Laravel Eloquent изнутри Behat / Mink FeatureContext - PullRequest
2 голосов
/ 06 марта 2019

Этот вопрос предполагает некоторое знание 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();

Как мне использовать Laravel Eloquent (делать вызовы из БД) изнутри Behat / Mink FeatureContext? Нужно ли предоставлять что-то в конструкторе моего FeatureContext? Обновить / добавить строку в файле composer.json или behat.yml?

Если есть несколько способов решить эту проблему и стоит упомянуть, пожалуйста, сделайте.

Дополнительные сведения

  • Laravel: 5.5.*

  • Behat: ^3.3

  • Расширение норки: ^2.2

  • Норка Селен 2 Водитель: ^1.3

Behat Config

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

1 Ответ

2 голосов
/ 13 июня 2019

Laravel необходимо настроить eloquent и соединение, чтобы это работало.

Самый простой способ - это удлинить laravel TestCase, а при вызове __constructor() parent::setUp();

Он настроит вашу тестовую среду, как и при запуске php-тестовых модулей в Laravel:

    /**
     * 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();
    }
...