symfony — Php-unit — не удалось утверждать, что myDomain \ Entity \ Likes является экземпляром класса myDomain \ Entity \ Likes & quot;

Я делаю тесты для веб-приложения, оно удаляет 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;
}
}
}

Почему не получается, если это одна и та же сущность? Это сущность, которую я ожидаю.

1

Решение

Кажется, вы хотите передать экземпляр 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
}
1

Другие решения

Посмотрите внимательно на этот метод:

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());
}
2

$ this-> assertInstanceOf (Likes :: class, $ likes); принял два аргумента class и object для подтверждения, если экземпляр класса ожидаемый объект. И вы можете использовать Перезвоните функция для подтверждения параметров, переданных методам

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector