私はWebアプリケーションのいくつかのテストを書いていますが、そのうちの1つが生産中に失敗しています&開発がうまくいきます。失敗だ
:
myMelomanBundle\Publication\CreatePublicationUseCaseTest::shouldCreateAPublicationOneTimeIfItDoesNotExist TypeError: Argument 1 passed to myDomain\Entity\Publication::setUser() must be an instance of myDomain\Entity\User, null given, called in /var/www/melomaniacs/src/myDomain/UseCases/Publication/CreatePublicationUseCase.php on line 48
CreatePublicationUseCaseTest.php:
<?php
namespace myMelomanBundle\Publication;
use myDomain\Entity\Publication;
use myDomain\UseCases\Publication\CreatePublicationUseCase;
use myMelomanBundle\Repository\UserRepository;
use myMelomanBundle\Repository\PublicationRepository;
use PHPUnit_Framework_MockObject_MockObject;
use Doctrine\ORM\EntityManagerInterface;
use myDomain\Entity\User;
class CreatePublicationUseCaseTest extends \PHPUnit_Framework_TestCase
{
const USER_ID = 2;
const MESSAGE = "message";
const URI = "spotify:uri:47n4in3482nk";
/**
* @var CreatePublicationUseCase
*/
private $createPublicationUseCase;
/**
* @var PHPUnit_Framework_MockObject_MockObject
*/
private $userRepositoryMock;
/**
* @var PHPUnit_Framework_MockObject_MockObject
*/
private $publicationRepositoryMock;
/**
* @var PHPUnit_Framework_MockObject_MockObject
*/
private $aDispatcherMock;
/**
* @var PHPUnit_Framework_MockObject_MockObject
*/
private $aEntityMock;
/**
* @var PHPUnit_Framework_MockObject_MockObject
*/
private $userMock;
protected function setUp()
{
$this->userRepositoryMock = $this->createMock(UserRepository::class);
$this->publicationRepositoryMock = $this->createMock(PublicationRepository::class);
$this->aEntityMock = $this->createMock(EntityManagerInterface::class);
$this->createPublicationUseCase = new CreatePublicationUseCase($this->publicationRepositoryMock, $this->userRepositoryMock, $this->aEntityMock);
$this->userMock = $this->createMock(User::class);
}
protected function tearDown()
{
$this->userRepositoryMock = null;
$this->publicationRepositoryMock = null;
$this->createPublicationUseCase = null;
$this->userMock = null;
}
/** @test */
public function dummyTest()
{
$this->createPublicationUseCase;
}
/** @test */
public function shouldCreateAPublicationOneTimeIfItDoesNotExist()
{
$this->givenAPublicationRepositoryThatDoesNotHaveASpecificPublication();
$this->thenThePublicationShouldBeSavedOnce();
$this->whenTheCreateUserUseCaseIsExecutedWithASpecificParameters();
}
private function givenAPublicationRepositoryThatDoesNotHaveASpecificPublication()
{
$this->publicationRepositoryMock
->method('find')
->willReturn(false);
}
private function thenThePublicationShouldBeSavedOnce()
{
$this->publicationRepositoryMock
->expects($this->once())
->method('create')
->willReturn($this->isInstanceOf(Publication::class));
}
private function whenTheCreateUserUseCaseIsExecutedWithASpecificParameters()
{
$this->createPublicationUseCase->execute(self::USER_ID, self::MESSAGE, null);
}
}
CreatePublicationUseCase.php
<?php
namespace myDomain\UseCases\Publication;
use Doctrine\ORM\EntityManagerInterface;
use myDomain\Entity\Publication;
use myDomain\Entity\User;
use myDomain\PublicationRepositoryInterface;
use myDomain\UserRepositoryInterface;
use myMelomanBundle\Repository\PublicationRepository;
use myMelomanBundle\Repository\UserRepository;
class CreatePublicationUseCase
{
/**
* @var PublicationRepository
*/
private $publicationRepository;
/**
* @var UserRepository
*/
private $userRepository;
private $entityManager;
public function __construct(
PublicationRepositoryInterface $publicationRepository,
UserRepositoryInterface $userRepository,
EntityManagerInterface $entityManager
)
{
$this->publicationRepository = $publicationRepository;
$this->userRepository = $userRepository;
$this->entityManager = $entityManager;
}
public function execute($userId, $message = null, $uri = null)
{
try{
/**
* @var User $user
*/
$user = $this->userRepository->findOneBy(array('id'=>$userId));
\Doctrine\Common\Util\Debug::dump($user);die; => Here
$publication = new Publication();
$publication->setMessage($message == null ? '' : $message);
$publication->setCreatedAt(new \DateTime());
$publication->setUser($user);
$publication->setStatus(0);
$publication->setLink($uri == null ? '' : $uri);
$this->publicationRepository->create($publication);
$this->entityManager->flush();
return $publication;
} catch (\Exception $e) {
return false;
}
}
}
ダンプがある場合、それは適切にユーザーオブジェクトを返すことに注意してください、テストではNULLを返すだけです。
テストでは、テストしなければならない同じユーザーオブジェクトの結果になるはずですか?
私は間違っていますか?あなたの問題は、あなたのテストでCreatePublicationUseCase::execute
$user = $this->userRepository->findOneBy(array('id'=>$userId));
から次の行から来ているように見えます
あなたはユーザーリポジトリの 'findOneBy()'コールをからかっている、または私は何かが欠けていますようにそれは見えません。 –
ありがとう@JasonRoman。はい、findOneBy()の呼び出しuserRepositoryMockが見つかりませんでした!ありがとう! – Albeis