PHP 테스트에서 인수 캡처

Você já está se sentindo confiante com suas habilidades de teste e os seus colegas te invejam ao ouvir você falar de mocks e stubs. Mas agora, um novo desafiourge e você só pode verificar certas propriedades de um argumento, caso contrário seus testes falharão miseravelmente.



Um novo dia começa



Seu trabalho era implementar uma simples funcionalidade de cadastro de usuário. Como uma boa programadora, você planeja usar o padrão Repositório para poder separar a camada de persistência e mocká-la em testes unitários caso necessário.



Classe usuário



Não poderia ser mais simples, certo?

final class User
{
    public function __construct(
        private string $id,
        private string $name)
    {
    }

    public function getId(): string
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }
}


사용 가능한 정보 저장소



당신의 운명은 계속될 것입니다.

final class UserRepository
{
    public function save(User $user): void
    {
        echo sprintf('Persistindo usuário com id %s e nome %s', $user->getId(), $user->getName());
    }
}


Classe UserService



아고라 테모스 우마 레비라볼타! Um requisito maluco diz que o campo id deve ser randômico. Bom, temos várias maneiras de fazer isso, então vamos prosseguir:

final class UserService
{
    public function __construct(private UserRepository $repository) { }

    public function createNewUser(string $name): void
    {
        $user = new User(uniqid(), $name);

        $this->repository->save($user);
    }
}


Legal, tudo está funcionando.

Não vamos nos esquecer dos testes





Nós queremos verificar quando UserService 크리아 음 User , se o UserRepostory está sendo chamado corretamente. 더 이상 중요하지 않은 항목은 지속적으로 문제가 발생하여 저장소 및 저장소에서 기능을 수행할 수 있도록 합니다.

public function testFailing(): void
{
    $repository = $this->createMock(UserRepository::class);

    $userService = new UserService($repository);

    $repository
        ->expects($this->once())
        ->method('save')
        ->with(new User('id não randômico', 'user'));

    $userService->createNewUser('user');
}


Infelizmente isso não funciona. O teste falha porque User com o id id não randômico UserRepository que tem um id diferente cada vez que um novo usuário é criado.

다시 논쟁의 여지가 있는 캡처라!



No Java, nós temos essa mesa funcionalidade provida pelo Mockito :

Captura de argumento possibilita a verificação de apenas alguns valores do argumento ao invés de testar a equalidade do objeto inteiro.



Nosso example, nos não nos precisamos testar realmente o valor do id porque ele é gerado randomicamente pelo próprio PHP através da função uniqid .

No final o teste usando captura de argumento 피카 아심

public function testRepositoryShouldCreateUserWithCorrectName(): void
{
    $repository = $this->createMock(UserRepository::class);

    $userService = new UserService($repository);

    $repository
        ->expects($this->once())
        ->method('save')
        ->will($this->returnCallback(function($user) {
            self::assertEquals('user', $user->getName());
        }));

    $userService->createNewUser('user');
}


Obrigado por ler até aqui, espero que tenha gostado e boa sorte com seus testes!

좋은 웹페이지 즐겨찾기