2017-09-11 8 views
1

私は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)); 

から次の行から来ているように見えます

+2

あなたはユーザーリポジトリの 'findOneBy()'コールをからかっている、または私は何かが欠けていますようにそれは見えません。 –

+0

ありがとう@JasonRoman。はい、findOneBy()の呼び出しuserRepositoryMockが見つかりませんでした!ありがとう! – Albeis

答えて

2

、あなたは嘲笑UserRepositoryに渡していますがfindOneByの出力を模擬しません。

$this->userRepositoryMock = $this->createMock(UserRepository::class); 

次のような結果を得て、結果を模擬した場合、あなたが望む結果が得られると思います。

$this->userRepositoryMock 
    ->expects($this->once()) 
    ->method('findOneBy') 
    ->will($this->returnValue(<value>)); 
+0

ありがとう@PhiloEpisteme!あなたが正しいです。私は追加する必要がありました:プライベート関数thenTheUserRepositoryShouldFindAUser(){ ます$ this-> userRepositoryMock - >見込ん(の$ this - >一度()) - >メソッド( 'findOneBy') - > willReturn(の$ this - > userMock) ; } ありがとうございました! :) – Albeis

関連する問題