Pergunta

Eu tenho código antigo que não usou TDD agora, quero escrever um teste para uma função que se parece com isso

function somefunction($someargs){
    // do a few checks on $someargs
    $database = new DB_PG();
    $result = $database->select($query);
    // do some changes on result
    return $result;
}

Como não sou muito expirado com phpunit e testes em geral, minha pergunta é: como posso zombar do DB_PG? Eu tentei getMock () no meu teste, mas como a função usa "novo" para obter uma instância, meu objeto simulado é ignorado, o que faz sentido

Então eu vejo apenas 2 opções

  1. Algumas características da phpunit, eu não sei - qual é a razão pela qual pergunto aqui ^^
  2. Eu tenho que modificar o código antigo - que eu sei que seria melhor

Então, alguém conhece uma resposta para a opção 1?

thx all

Foi útil?

Solução

OPÇÃO 1

Você pode alterar a função para funcionar da seguinte maneira:

function someFunc($existingArgs, $db = null)
{
    $db = (is_null($db)) = new DB_PG();
    $result = $db->select($query)

    $return $result;
}

Dessa forma, você pode passar em uma instância de banco de dados, isso permite pelo menos testar essa função; no futuro, você pode refatorar as coisas de modo que o trabalho de Somefunc esteja nos modelos, e o material de carga db acontece através de um DAO/repositório/fábrica.

OPÇÃO 2

Se o db_pg ainda não estiver puxado por meio de um requisito/incluir no arquivo em que essa função vive, você pode definir uma classe fictícia dentro da sua aula de teste

class DB_PG
{
    public function select($query)
    {
        //use phpunit's libs to output a mock object, you'll need to use the PHPUnit_Framework_Mock::generate() static method, I think that's the name.
        return $mockResult;
    }
}

Dessa forma, você pode controlar o que acontece com o resultado.

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