Пишу тесты для приложения на symfony, в нем есть консольная команда которая запускает множество методов, которые берут сущности из базы, циклично отправляют запросы на сторонние API, и в результате записывают некие данные назад в базу. Когда я запускал эту команду то все работало, в тестах же я вызываю эти методы по отдельности, а сущности создаю перед тестими в DataFixtures а уже в естах вытягиваю так:
self::$campaign = self::$kernel->getContainer()->get('doctrine')
->getRepository(Campaign::class)
->findOneBy(['name' => 'Test campaign for sync 1']);
тест:
public function testCreateCampaign(): void
{
$fbCampaign = self::$campaignService->create(self::$campaign);
$this->assertInstanceOf(FCampaign::class, $fbCampaign);
$this->assertEquals(self::$campaign->getUser()->getCompany()->getName() . '/Test campaign for sync 1', $fbCampaign->getData()[CampaignFields::NAME]);
$this->assertEquals(true, $this->seeInDatabase(CampaignChannels::class, ['facebookCampaignId' => $fbCampaign->getData()[CampaignFields::ID]]));
}
но тут уже не работает а выдаёт ошибки типа:
Doctrine\ORM\ORMInvalidArgumentException : A new entity was found through the relationship 'CampaignBundle\Entity\CampaignChannels#campaign' that was not configured to cascade persist operations for entity: CampaignBundle\Entity\Campaign@000000003d9037ca000000005eb33dc7. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}). If you cannot find out which entity causes the problem implement 'CampaignBundle\Entity\Campaign#__toString()' to get a clue.
/**
* @var CampaignChannels[]
*
* @ORM\OneToMany(targetEntity="CampaignBundle\Entity\CampaignChannels", mappedBy="campaign")
*/
private $channels;
/**
* @var Campaign
*
* @ORM\ManyToOne(targetEntity="CampaignBundle\Entity\Campaign", inversedBy="channels")
* @ORM\JoinColumn(name="campaign_id", referencedColumnName="id")
*/
private $campaign;
метод который тестируется:
public function create(Campaign $campaign): FCampaign
{
$fbCampaign = new FCampaign(null, 'act_' . $this->facebook->getAccountId());
$fbCampaign->setData([
CampaignFields::NAME => $this->getCampaignName($campaign),
CampaignFields::OBJECTIVE => CampaignObjectiveValues::LINK_CLICKS
]);
try {
$fbCampaign->create([
FCampaign::STATUS_PARAM_NAME => FCampaign::STATUS_ACTIVE,
]);
} catch (\Exception $ex) {
$this->saveErrors($ex, null, $campaign->getId());
throw $ex;
}
$channel = $campaign->getFacebookChannel();
$channel->setFacebookCampaignId($fbCampaign->getData()[CampaignFields::ID]);
$channel->setLastSync(time());
$this->objectManager->persist($channel);
$this->objectManager->flush();
return $fbCampaign;
}
Ещё один ньюанс - до того как я создавал мои сущности в DataFixtures я их создавал прямо в методе setUpBeforeClass(), сохранял в статические переменные и оттуда вызывал - и все работало, но после того как перенес в DataFixtures работать перестало, хотя сами методы что я тестирую никак не редактировал
Вы не вызвали persist для вновь созданной сущности Campaign
.
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
Варианта решения 2:
$em->persist($campaign)
для неё.persist
, если сущность была создана, как зависимость другой сущности, которой Вы persist
вызываете.Измените связь:
/**
* @var CampaignChannels[]
*
* @ORM\OneToMany(targetEntity="CampaignBundle\Entity\CampaignChannels", mappedBy="campaign", cascade={"persist"})
*/
private $channels;
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
столкнулся с проблемой что при редактировании записи с загруженным изображением, оно отсуствует и приходится заного загружать, не делоДелал...
Есть тема DFD Native для wordpress, там есть тип страниц - портфолиоЕсли создать страницу с таким урл - http://sitename
Приходит ответ от сервера в формате json, надо вывести только баланс, как это сделать ?