A melhor Maneira de Unidade de Teste de um Site Com Vários Tipos de Usuário com PHPUnit

StackOverflow https://stackoverflow.com/questions/58969

  •  09-06-2019
  •  | 
  •  

Pergunta

Eu estou começando a aprender a utilizar o PHPUnit para testar o site que eu estou trabalhando.O problema que eu estou correndo em é que eu tenho cinco diferentes tipos de usuário definido e preciso ser capaz de teste de cada classe com os diferentes tipos.Eu tenho atualmente uma classe de utilizador e eu gostaria de passar isso para cada função, mas eu não consigo descobrir como passar essa ou testar os diferentes erros que poderiam voltar como sendo correto ou não.

Editar: Eu deveria ter dito.Eu tenho uma classe de utilizador e eu quero passar uma instância diferente desta classe para cada unidade de teste.

Foi útil?

Solução

Se as suas várias classes de usuário herdar de um pai de classe de usuário, então eu recomendo que você use a mesma herança estrutura para o seu caso de teste classes.

Considere o seguinte exemplo de classes:

class User
{
    public function commonFunctionality()
    {
        return 'Something';
    }

    public function modifiedFunctionality()
    {
        return 'One Thing';
    }
}

class SpecialUser extends User
{
    public function specialFunctionality()
    {
        return 'Nothing';
    }

    public function modifiedFunctionality()
    {
        return 'Another Thing';
    }
}

Você pode fazer o seguinte com o seu caso de teste classes:

class Test_User extends PHPUnit_Framework_TestCase
{
    public function create()
    {
        return new User();
    }

    public function testCommonFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Something', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('One Thing', $user->commonFunctionality);
    }
}

class Test_SpecialUser extends Test_User
{
    public function create() {
        return new SpecialUser();
    }

    public function testSpecialFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Nothing', $user->commonFunctionality);
    }

    public function testModifiedFunctionality()
    {
        $user = $this->create();
        $this->assertEquals('Another Thing', $user->commonFunctionality);
    }
}

Porque cada teste depende de um método de criar o que você pode substituir, e porque os métodos de teste são herdadas da pasta principal classe de teste, todos os testes para a classe pai será executado contra a criança de classe, a menos que você substituí-los para alterar o comportamento esperado.

Este tem trabalhado muito na minha experiência limitada.

Outras dicas

Se você estiver olhando para testar a real INTERFACE do usuário, você pode tentar usar algo como o Selênio (www.openqa.org).Ele permite que você escreva o código em PHP (que eu estou supondo que iria trabalhar com phpUnit) para a unidade do navegador..

Outra abordagem seria a de ter um método comum, que poderia ser chamada por cada teste para os diferentes tipo de usuário.ou seja, algo como "ValidatePage', o que você poderia chamar de TestAdminUser ou TestRegularUser e possui o método simplesmente executar o mesmo tipo de validação que você está esperando..

Apenas certifique-se você não estiver executando em um anti-padrão aqui.Talvez você fazer muito trabalho no construtor?Ou talvez estes devem ser diferentes classes?Testes de muitas vezes dar-lhe pistas sobre design de código. Ouvi-los.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top