Здравствуйте. Вопрос вот в чем. Начал писать приемочные тесты для Yii2 приложения.
Наткнулся на следующее:
public function landToFirstEnterApplication(AcceptanceTester $I)
{
/** @var UrlManager $urlManager */
$urlManager = Yii::$app->get('frontendUrlManager');
$I->amOnUrl($urlManager->getHostInfo());
$I->see('Авторизация');
$I->click('Зарегистрироваться');
$I->see('Зарегистрироваться');
$I->fillField(['id' => 'emailform-email'], $userEmail = 'tester@example.com');
$I->click('Продолжить');
$I->waitForText('Вернуться на главную страницу', 2);
$I->seeEmailIsSent(1);
/** @var Message $mail */
$mail = $I->grabLastSentEmail();
expect($mail->getTo())->hasKey($userEmail);
$link = $this->getLink($mail->getSwiftMessage()->getChildren()[0]->getBody());
$I->amOnUrl($link);
$I->see('Установить пароль');
}
Тест падает на $I->seeEmailIsSent(1);
Так происходит, потому что в текущем экземпляре Yii::$app, созданном внутри теста, используется тестовая заглушка из Codeception, которая кладет все письма к себе в приватный массив.
Потом с этим массивом работает метод
seeEmailIsSent и все, что рядом с ним.
А сам $I сейчас использует объект приложения, просто созданный из тестового конфига, в котором mailer не заменяется на класс из Codeception.
Собственно, вопрос: как писать тест так, чтобы использовался Yii::$app из теста, а не созданный при запросе?
acceptance.suite.yml
actor: AcceptanceTester
modules:
enabled:
- WebDriver:
url:
127.0.0.1:44444
browser: chrome
- Yii2:
configFile: 'common/config/test-local.php'
part:
- email
- ORM
- Fixtures
- init
cleanup: false
transaction: false
recreateApplication: true