Mock recém -criada instância?
-
05-07-2019 - |
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
- Algumas características da phpunit, eu não sei - qual é a razão pela qual pergunto aqui ^^
- 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
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.