Ссылка на объект приспособления неверна в функциональном тесте - PullRequest
0 голосов
/ 10 июля 2020

Функциональный тестовый класс полагается на ссылку на объект, созданную в приспособлении. Однако идентификатор ссылки не идентичен свойству id объекта, возвращаемому диспетчером сущностей. Ниже приведен тест, демонстрирующий эту проблему.

Примечания:

  1. Ошибка при использовании $this->setReference(...) такая же, как и при использовании public const ... и $this->addReference(...).
  2. Ссылка на объект, использованная в тесте, кажется, является следующим доступным идентификатором для некоммерческих организаций.
  3. Тестовый класс был создан после того, как ошибка была обнаружена в более общем тестовом классе.
  4. Ошибка одинакова вне зависимости от того, загружены ли приборы перед запуском тестового класса.
  5. Приложение использует Symfony 5.1.2 со всеми обновленными зависимостями.

Тестовый класс :

namespace App\Tests\Controller;

use Liip\TestFixturesBundle\Test\FixturesTrait;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

class ReferenceTest extends WebTestCase
{

    use FixturesTrait;

    public function setup(): void {
        $this->client = $this->createClient();

        $this->fixtures = $this->loadFixtures([
                    'App\DataFixtures\Test\OptionsFixture',
                    'App\DataFixtures\Test\NonprofitFixture',
                    'App\DataFixtures\Test\OpportunityFixture',
                    'App\DataFixtures\Test\UserFixture',
                ])
                ->getReferenceRepository();
        $this->client->followRedirects();

        $kernel = self::bootKernel();

        $this->entityManager = $kernel->getContainer()
                ->get('doctrine')
                ->getManager('test');
    }

    public function testNonprofitReference() {
        $npo = $this->entityManager->getRepository(\App\Entity\Nonprofit::class)
                ->findOneBy(['orgname' => 'Marmot Fund']);
        $nId = $npo->getId();
        $id = $this->fixtures->getReference('npo')->getId();

        $this->assertEquals($nId, $id, 'Reference incorrect');
    }   
}

Результат теста:

Reference incorrect
Failed asserting that 4 matches expected 1.

NonprofitFixture (другие фикстуры могут не иметь значения):

namespace App\DataFixtures\Test;

use App\Entity\Nonprofit;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Bundle\FixturesBundle\ORMFixtureInterface;

class NonprofitFixture extends AbstractFixture implements OrderedFixtureInterface, ORMFixtureInterface
{

    public const NPO_REFERENCE = 'npo';

    public function load(ObjectManager $manager) {
        $npo = new Nonprofit();
        $npo->setOrgname('Marmot Fund');
        $npo->setEin('123456789');
        $npo->setActive(false);
//        $this->setReference('npo', $npo);
        $this->addReference(self::NPO_REFERENCE, $npo);

        $npo1 = new Nonprofit();
        $npo1->setOrgname('Turkey Fund');
        $npo1->setEin('321654978');
        $npo1->setActive(true);
        $npo1->setWebsite('http://turkeysRUs.bogus.info');

        $npo3 = new Nonprofit();
        $npo3->setOrgname('Talk Trash Fund');
        $npo3->setEin('978654321');
        $npo3->setActive(true);
        $npo3->setWebsite('http://ttrash.bogus.info');

        $staff = $this->getReference(UserFixture::STAFF_REFERENCE);
        $npo->setStaff($staff);
        
        $opp = $this->getReference(OpportunityFixture::OPP_REFERENCE);
        $opp1 = $this->getReference(OpportunityFixture::OPP1_REFERENCE);
        $npo1->addOpportunity($opp);
        $npo3->addOpportunity($opp1);

        $manager->persist($npo);
        $manager->persist($npo1);
        $manager->persist($npo3);

        $manager->flush();
    }

    public function getOrder() {
        return 5; // the order in which fixtures will be loaded
    }

}

framework.yaml выдержка:

liip_test_fixtures:
    keep_database_and_schema: true
    cache_db:
        sqlite: liip_test_fixtures.services_database_backup.sqlite

dama_doctrine_test_bundle.yaml:

dama_doctrine_test:
    enable_static_connection: true
    enable_static_meta_data_cache: true
    enable_static_query_cache: true

экспорт csv из app.db:

"id","orgName"
"1","Marmot Fund"
"2","Turkey Fund"
"3","Talk Trash Fund"

1 Ответ

0 голосов
/ 17 июля 2020

Ответ такой, какой он есть, заключается в том, что ссылкам нет места в функциональном тесте. Их использование на самом деле является ярлыком для нажатия на ссылки или выполнения каких-либо других действий. Лучше всего использовать сканер для имитации c действия.

...