Somehow we are having trouble enabling these three modules. Yii2 and Webdriver play nicely together but when we add DataFactory we get a duplicate class Exception.
Build runs OK:
Building Actor classes for suites: acceptance, functional, unit
-> AcceptanceTesterActions.php generated successfully. 0 methods added
\AcceptanceTester includes modules: WebDriver, Yii2, DataFactory
-> FunctionalTesterActions.php generated successfully. 0 methods added
\FunctionalTester includes modules: Filesystem, Yii2
-> UnitTesterActions.php generated successfully. 0 methods added
\UnitTester includes modules:
Our acceptance.suite.yml:
class_name: AcceptanceTester
modules:
enabled:
- WebDriver:
restart: false
clear_cookies: false
browser: firefox
url: http://localurl
- Yii2:
part: ORM
configFile: 'codeception/config/acceptance.php'
- DataFactory:
factories: tests/_support/factories
depends: Yii2
env:
acceptance:
modules:
config:
WebDriver:
browser: phantom
url: http://accurl
When running:
PHP Fatal error: Cannot redeclare class _generated\AcceptanceTesterActions in /Applications/MAMP/htdocs/invatio/vwp/tests/codeception/_support/_generated/AcceptanceTesterActions.php on line 13
We are using Codeception version 2.2.1.
Having exactly the same issue with Yii2 and DataFactory in functional tests
Looking at the stack trace I can see my Cest file is first loaded in Codeception/Lib/Parser::includeFile(), line 197
then it's loaded again from League/FactoryMuffin/FactoryMuffin::loadDirectory() line 351
My functional_suite.yml file is:
class_name: FunctionalTester
modules:
enabled:
- Filesystem
- Yii2
- DataFactory:
factories: tests/_support/factories
depends: Yii2
- \tests\codeception\frontend\Helper\Factories
config:
Yii2:
configFile: '../config/frontend/functional.php'
I think I've found the bug. In both the files you specify:
beastbytes: tests/_support/factories
breadleyg: tests/_support/factories
But seeing the code, it expects a path relative to the codeception.yml file. However Yii2 specifies a subfolder in tests (codeception) and that's why it does not work.
Then because Codeception uses realpath:
$this->factoryMuffin->loadFactories(realpath(codecept_root_dir().$factoryPath));
This returns false if the directory does not exist. This results in factoryMuffin to load a empty directory (so basically it tries to load every php file in the Codeception folder). This is why it gets the duplicate class exception.
I will put in a pull request that throws an Exception when the factory folder can not be found and will update the documentation.
@alexjeen thanks for the investigation and solution