Я делаю тесты для веб-приложения, оно удаляет Likes Record из базы данных, но я получаю эту неоднозначную ошибку.
Ожидание не удалось для имени метода равно, когда вызывается 1 раз (а).
Параметр 0 для вызова myMelomanBundle \ Repository \ LikesRepository :: remove (‘myDomain \ Entity \ Likes’) не соответствует ожидаемому значению.
Не удалось утверждать, что «myDomain \ Entity \ Likes» является экземпляром класса «myDomain \ Entity \ Likes».
DislikePublicationUseCaseTest.php
<?php
namespace myMelomanBundle\Likes;class DislikePublicationUseCaseTest extends \PHPUnit_Framework_TestCase
{
const User = 2;
const PUB = 15;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $publicationRepositoryMock;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $userRepositoryMock;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $likesRepositoryMock;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $entityManagerMock;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $userMock;
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
private $publicationMock;
private $likesMock;
/**
* @var DislikePublicationUseCase
*/
private $dislikePublicationUseCase;
/**
* @var LikeDTO
*/
private $likeDTO;
protected function setUp()
{
$this->publicationRepositoryMock = $this-
>createMock(PublicationRepository::class);
$this->userRepositoryMock = $this-
>createMock(UserRepository::class);
$this->likesRepositoryMock = $this-
>createMock(LikesRepository::class);
$this->entityManagerMock = $this-
>createMock(EntityManager::class);
$this->userMock = $this->createMock(User::class);
$this->publicationMock = $this->createMock(Publication::class);
$this->likesMock = $this->createMock(Likes::class);
$this->likeDTO = new LikeDTO(self::User, self::PUB);
$this->dislikePublicationUseCase = new DislikePublicationUseCase(
$this->publicationRepositoryMock,
$this->userRepositoryMock,
$this->likesRepositoryMock,
$this->entityManagerMock
);
}
protected function tearDown()
{
$this->publicationRepositoryMock = null;
$this->userRepositoryMock = null;
$this->likesRepositoryMock = null;
$this->entityManagerMock = null;
$this->userMock = null;
$this->publicationMock = null;
$this->likesMock = null;
}
/** @test */
public function dummyTest()
{
$this->dislikePublicationUseCase;
}
/** @test */
public function shouldRemoveALikeOneTimeIfItExist()
{
$this->givenALikeRepositoryThatHasASpecificLike();
$this->andGivenAUserRepositoryThatHaveASpecifiUser();
$this->andGivenAPublicationRepositoryThatHaveASpecificPublication();
$this->thenTheLikeShouldBeRemovedOnce();
$this->whenTheDislikePublicationUseCaseIsExecutedWithASpecificParameters();
}
private function givenALikeRepositoryThatHasASpecificLike()
{
$this->likesRepositoryMock
->method('findOneBy')
->willReturn(Likes::class);
}
private function andGivenAUserRepositoryThatHaveASpecifiUser()
{
$this->userRepositoryMock
->method('find')
->willReturn($this->userMock);
}
private function andGivenAPublicationRepositoryThatHaveASpecificPublication()
{
$this->publicationRepositoryMock
->method('find')
->willReturn($this->publicationMock);
}
private function thenTheLikeShouldBeRemovedOnce()
{
$this->likesRepositoryMock
->expects($this->once())
->method('remove')
->with($this->isInstanceOf(Likes::class)); // Here Fails
}
private function
whenTheDislikePublicationUseCaseIsExecutedWithASpecificParameters()
{
$this->dislikePublicationUseCase->execute($this->likeDTO);
}
}
DislikePublicationUseCase.php
<?php
namespace myDomain\UseCases\Like;
class DislikePublicationUseCase
{
private $publicationRepository;
private $userRepository;
private $likesRepository;
private $entityManager;
public function __construct (
PublicationRepositoryInterface $publicationRepository,
UserRepositoryInterface $userRepository,
LikesRepositoryInterface $likesRepository,
EntityManagerInterface $entityManager
)
{
$this->publicationRepository = $publicationRepository;
$this->userRepository = $userRepository;
$this->likesRepository = $likesRepository;
$this->entityManager = $entityManager;
}
public function execute(LikeDTO $likeDTO)
{
try {
$user = $this->userRepository->find($likeDTO->getUserId());
$publication = $this->publicationRepository->find($likeDTO->getPublicationId());
$like = $this->likesRepository->findOneBy(
array(
'user' => $user,
'publication' => $publication
)
);
$this->likesRepository->remove($like);
return true;
} catch (\Exception $e) {
return false;
}
}
}
Почему не получается, если это одна и та же сущность? Это сущность, которую я ожидаю.
Кажется, вы хотите передать экземпляр Likes
в качестве параметра для LikesRepository::remove()
, Вы близко, но вы пытаетесь передать boolean
в качестве параметра вместо.
Так что вам нужно передать это Likes
пример. У вас уже есть это, так что передайте:
private function thenTheLikeShouldBeRemovedOnce()
{
$this->likesRepositoryMock
->expects($this->once())
->method('remove')
->with($this->likesMock); // Here Fails
}
Я не знаю что remove()
возвращаемое значение есть, но вы также можете проверить это:
private function thenTheLikeShouldBeRemovedOnce()
{
$this->likesRepositoryMock
->expects($this->once())
->method('remove')
->with($this->likesMock)
->will($this->returnValue(true)); // if remove() returns true on success
}
Посмотрите внимательно на этот метод:
private function givenALikeRepositoryThatHasASpecificLike()
{
$this->likesRepositoryMock
->method('findOneBy')
->willReturn(Likes::class);
}
Заметили это еще?
Спойлер:
->willReturn(Likes::class);
Макет вернет строка Любит :: класс.
var_dump(Likes::class); // string(19) "myDomain\Entity\Likes"
Измените это на что-то вроде:
private function givenALikeRepositoryThatHasASpecificLike()
{
$this->likesRepositoryMock
->method('findOneBy')
->willReturn(new Likes());
}
$ this-> assertInstanceOf (Likes :: class, $ likes); принял два аргумента class и object для подтверждения, если экземпляр класса ожидаемый объект. И вы можете использовать Перезвоните функция для подтверждения параметров, переданных методам