Codeception / module-doctrine

Next gen Doctrine module for Codeception
MIT License
2 stars 1 forks source link

Different results if I run one test and all test in same time #17

Open ilijastojkovic opened 5 years ago

ilijastojkovic commented 5 years ago

What are you trying to achieve?

Right now, I have some strange behaviour while running functional tests. If I run one file codecept run functional /FunctionalFolder/Services/ServiceOneCest, all tests are success - as expected. But in secound case, when I run all created tests codecept run functional /FunctionalFolder, some tests are finished as expected, while some others are failed.

Somehow, in _before() section, are not executed all dependeces.

class ServiceOneCest
{
public function _before(FunctionalTester $I)
 {
            $this->entityManager = $I->grabServiceFromContainer(EntityManager::class);
            $this->entity = $this->entityManager->getRepository(Entity::class)
            ->findOneBy([
                'name' => 'test'
            ]);

        if (!$this->entity) {
            $this->entity = $I->have(Entity::class, ['name' => 'test']);
        }
}

public function testSomething(FunctionalTester $I)
{
      $I->assertEquals('test', $this->entity->getName());
      // here I catch error message [Error] Call to a member function getName() on null
      // it only happend when I run more then one test file
}
}

//also exist some other test file

class ServiceTwoCest
{
}

I expect same results if I run one test file or more. I need to say, don't have any dependece between test data created in _before()

Please, if you see any reason or my bad code/configuration anything, give me handsup. If you have some other questions, please feel free to contact me.

Details

Naktibalda commented 5 years ago

if (!$entity) {

Check $this->entity instead.

ilijastojkovic commented 5 years ago

thanks for the hint, but this is a typo.

Naktibalda commented 5 years ago

Have you made another typo in this line?

$this->entity = $I->have(Entity::class, ['name' => 'test']);

If you actually used haveInRepository there, this method does not return entity, so null is assigned to $this->entity.

ilijastojkovic commented 5 years ago

I don't think so. $I->have() return

     * [!] Method is generated. Documentation taken from corresponding module.
     *
     * Generates and saves a record,.
     *
     * ```php
     * $I->have('User'); // creates user
     * $I->have('User', ['is_active' => true]); // creates active user
     * ```
     *
     * Returns an instance of created user.
     *
     * @param string $name
     * @param array $extraAttrs
     *
     * @return object
     * @see \Codeception\Module\DataFactory::have()
     */
    public function have($name, $extraAttrs = null) {
        return $this->getScenario()->runStep(new \Codeception\Step\Action('have', func_get_args()));
    }

So $this->entity is instance of provided Entity::class

SeCoBremen commented 4 years ago

Did you have a solution? I have the same problem right now

Clasyc commented 10 months ago

Same problem for me: https://github.com/Codeception/Codeception/issues/6682