Codeception: Cannot redeclare AcceptanceTesterActions

Created on 11 Jun 2016  路  3Comments  路  Source: Codeception/Codeception

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.

BUG

All 3 comments

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

Was this page helpful?
0 / 5 - 0 ratings

Related issues

sebastianneubert picture sebastianneubert  路  3Comments

centerax picture centerax  路  4Comments

schmunk42 picture schmunk42  路  3Comments

gimler picture gimler  路  3Comments

joshhornby picture joshhornby  路  3Comments