Codeception, напишите приемочные тесты с шаблоном оформления объекта и огурчиком

Я ищу простой пример кода с шаблоном дизайна pageObject и огурчиком, потому что, когда я следую кодовая документация BDD, все примеры написаны в тестах /поддержка / AcceptanceTester.php. Я не понимаю (плохое знание английского языка —-) как не сконцентрировать весь код в файле AcceptanceTester.php.

Например, у меня есть пример домашней страницы с двумя кнопками A и B. Если пользователь нажимает кнопку A, страница A загружается в противном случае, если пользователь нажимает кнопку B, страница B загружается.

В настоящее время, мой AcceptanceTester :

<?php
// tests/_support/AcceptanceTester.php
/**
* Inherited Methods
* @method void wantToTest($text)
* @method void wantTo($text)
* @method void execute($callable)
* @method void expectTo($prediction)
* @method void expect($prediction)
* @method void amGoingTo($argumentation)
* @method void am($role)
* @method void lookForwardTo($achieveValue)
* @method void comment($description)
* @method \Codeception\Lib\Friend haveFriend($name, $actorClass = NULL)
*
* @SuppressWarnings(PHPMD)
*/

class AcceptanceTester extends \Codeception\Actor
{
use _generated\AcceptanceTesterActions;

/**
* @Given The home page
*/
public function inHomePage()
{
$this->amOnPage("/");
$this->seeInTitle('home');
}

/**
* @When I click on the button A
*/
public function goToThePageA()
{
$this->click(['name' => 'A']);
}

/**
* @Then l go to the page A
*/
public function ImInPageA()
{
$this->seeInTitle('page A');
}

/**
* @When I click on the button B
*/
public function goToThePageB()
{
$this->click(['name' => 'B']);
}

/**
* @Then l go to the page B
*/
public function ImInPageB()
{
$this->seeInTitle('page B');
}
}

Если я запускаю команду «./vendor/bin/codecept run accept», все работает как чудо. Но, как я уже говорил ранее, я хочу научиться не концентрировать весь код в файле AcceptanceTester.

Итак, я создал три объекта pageObjects; один для домашней страницы, один для страницы A и один для страницы B. Код:

главная страницаОбъект :

<?php
// tests/_support/Page/PageHome.php
namespace Page;

class PageHome
{
public static $URL = '/home';
public static $title = "home";
public static $aButton = ['name' => 'A'] ;
public static $bButton = ['name' => 'B'] ;

public static function route($param){
return static::$URL.$param;
}

/**
* @var \AcceptanceTester;
*/
protected $acceptanceTester;

public function __construct(\AcceptanceTester $I){
$this->acceptanceTester = $I;
}
}

объект страницы :

<?php
// tests/_support/Page/PageA.php
namespace Page;

class PageA
{
public static $URL = '/home/pageA';
public static $title = "page A";

public static function route($param){
return static::$URL.$param;
}

/**
* @var \AcceptanceTester;
*/
protected $acceptanceTester;

public function __construct(\AcceptanceTester $I){
$this->acceptanceTester = $I;
}
}

А также B pageObject :

<?php
// tests/_support/Page/PageB.php
namespace Page;

class PageB
{
public static $URL = '/home/pageB';
public static $title = "page B";

public static function route($param){
return static::$URL.$param;
}

/**
* @var \AcceptanceTester;
*/
protected $acceptanceTester;

public function __construct(\AcceptanceTester $I){
$this->acceptanceTester = $I;
}
}

Затем я создал три stepObjects; homeChecker, goToPageA, goToPageB

HomeChecker stepObject :

<?php
// tests/_support/Step/Acceptance/HomeChecker.php

namespace Step\Acceptance;
use Page\Acceotance\HomePage;

class HomeChecker extends \AcceptanceTester
{
/**
* @Given The home page
*/
public function main()
{
$homePage = new PageHome($this);

$this->amOnPage($homePage::URL);
$this->checkTitle($homePage);
$this->checkButtons($homePage);
}

private function checkTitle($homePage){
$this->seeInTitle($homePage::$title);
}

private function checkButtons($homePage){
$this->see($homePage::$aButton);
$this->see($homePage::$bButton);
}
}

PageAChecker stepObject :

<?php
// tests/_support/Step/Acceptance/PageAChecker.php

namespace Step\Acceptance;
use Page\PageHome;
use Page\PageA;

class PageAChecker extends \AcceptanceTester
{
/**
* @When I click on the button A
*/
public function clickButton()
{
$homePage = new PageHome($this);
$this->click($homePage::$aButton);
}

/**
* @Then l go to the page A
*/
public function checkTitle()
{
$aPage = new PageA($this);
$this->seeInTitle($aPage::$title);
}

}

А также PageBChecker stepObject :

<?php
// tests/_support/Step/Acceptance/PageBChecker.php

namespace Step\Acceptance;
use Page\PageHome;
use Page\PageB;

class PageBChecker extends \AcceptanceTester
{
/**
* @When I click on the button B
*/
public function clickButton()
{
$homePage = new PageHome($this);
$this->click($homePage::$bButton);
}

/**
* @Then l go to the page B
*/
public function checkTitle()
{
$bPage = new PageB($this);
$this->seeInTitle($bPage::$title);
}

}

И теперь я не знаю, что я должен делать. Если я очищаю свой файл AcceptanceTester и снова запускаю команду «./vendor/bin/codecept run accept», тест не завершен, и я получаю предупреждения «не найдено в контекстах» в моей оболочке:

введите описание изображения здесь

Что я делаю ?

Обновить
Я создал пост в GitHub кодекса здесь:

https://github.com/Codeception/Codeception/issues/5157

Я опишу минимальный пример для воспроизведения моей проблемы и (очень) безобразное решение. Я ищу хороший способ и понимаю, почему я описал не работает!

21

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]