Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diogo Alexsander

PHPUnit criar mock de método.

Recommended Posts

Boa tarde, pessoal.

 

Estou há alguns dias tentando passar de um problema no PHPUnit, mas tá estranho.

Antes de tudo... sou novo no processo de TDD.

 

Estou tentando "mockar" um método de uma classe, e quero me certificar de que quando eu chame este método, ele chame um terceiro método.

 

Bom, segue código com comentários do que eu quero fazer mas não estou conseguindo...

 

 

Classe: Usuario

<?php

namespace Minha\Classe\Concreta;

class Usuario
{
    /** 
     * Este é o método que eu tento mockar, para posteriormente, verificar se ele chama o método teste2.
     */
    public function teste()
    {
        $this->teste2();
    }

    private function teste2()
    {

    }
}

O teste unitário para ela...

<?php

class UsuarioTest extends \PHPUnit_Framework_TestCase
{
    public function testMockingMethods()
    {
        // Crio um mock da minha classe Usuário com o método teste.
        $mock = $this->getMockBuilder('Minha\Classe\Concreta\Usuario')
            ->disableOriginalConstructor()
            ->setMethods(['teste'])
            ->getMock();

        // Espero que o método teste2 seja chamado uma vez apenas.
        $mock->expects($this->once())
            ->method('teste2');

        // Chamo o método "teste" para rodar o teste de fato e certificar que "teste2" foi chamado.
        $mock->teste();
    }
}

Ao rodar esse teste, o resultado é o seguinte...

vagrant@vm:/www$ (master) ✖ ./library/vendor/bin/phpunit
PHPUnit 4.8.21 by Sebastian Bergmann and contributors.

Runtime:    PHP 5.5.9-1ubuntu4.17 with Xdebug 2.2.3
Configuration:  /www/teste/phpunit.xml

F

Time: 13.13 seconds, Memory: 14.25MB

There was 1 failure:

1) UsuarioTest::testMockingMethods
Expectation failed for method name is equal to <string:teste2> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

Pois bem, eu não sei o que está errado na minha classe de teste.

Já verifiquei várias vezes na própria documentação do PHPUnit mas não sei o que estou fazendo errado ainda.

 

Agradeço desde já.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O mock é para substituir uma funcionalidade, como por exemplo, ao invés de escrever em arquivo (que seria a funcionalidade original do método) escrever em memória. Você não chega a estar substituindo-a, apenas quer garantir que o test chame test2.

 

Seu questionamento entra mais no caso de testes sobre métodos privados, que não são aconselhados.

http://stackoverflow.com/questions/105007/should-i-test-private-methods-or-only-public-ones

 

Caso seu método privado tenha uma alta complexidade, então, nesse caso, seria aconselhado você separar a lógica dele em outros métodos ou, até, em outra classe, conforme a técnica de refatoração Method Object

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo o que eu entendo (não consigo testar no momento) você não precisa realizar o mock de teste2, pois não tem intenção de mudar o comportamento do método. Se você o fizer, as chamadas internas não serão mais realizadas.

 

Se você deseja realizar a alteração do comportamento do método teste2, adicione no setMethods, senão, não o utilize.

 

Os demais passos parecem estarem corretos.

 

Nos exemplos apresentados no link mencionado, há a questão de alterar o comportamento do método sim_ou_nao. Pois em um momento ele precisa retornar um valor e, em outro, o valor contrário.

 

Ps.: Eu exclui um dos seus posts duplicados e você removeu o texto do outro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto eu meu post anterior, na verdade eu esqueci de responder com citação da primeira vez, então dupliquei a resposta e coloquei a citação, pra daí apagar o primeiro. Você apagou o que eu tinha corrigido, hehe.

 

Entendi. Só devo fazer mock quando quero alterar o comportamento do método então, pra que seja testado nas várias possíveis situações.

Bom, eu vou marcar este tópico como resolvido. O que você respondeu agora vai me fazer escrever os testes de forma diferente e eu vou pesquisar mais sobre o uso de mocks.

 

Muito obrigado pelo esclarecimento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De certa forma, como não consigo testar o comportamento no momento, é o que meu conhecimento está me deduzindo.

 

Caso necessário, podes voltar a este tópico.

 

Sobre o post apagado:

Citações de posts em sequência, são removidas por recomendação, pois, são desnecessárias. Somente são recomendadas quando são para trechos ou posts mais antigos da thread. Conforme orientação nº 8 e como pode ser visto no tópico abaixo:

http://forum.imasters.com.br/topic/542539-atencao-orientacoes-e-regras-do-forum-de-php/

http://forum.imasters.com.br/topic/464950-resolvidodesativar-cliente-depois-de-1-mes/

 

Como o conteúdo de ambas era igual, só mudava a citação, e, posteriormente, eu removeria a citação, ficava mais fácil apenas excluir o post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Mad_Max
      Estou lendo o livro do waldemar neto sobre nodejs, e tem uma parte que não consigo sair, fiz uma configuração para rodar um teste  na minha aplicação, baixei os modules que o livro pediu: mocha, chai e p supertest e no meu package.json coloquei o seguinte script: 
       
      "test:integration": "NODE_ENV=test mocha --opts test/integration/mocha.opts test/integration/**/*_spec.js"  
      so que quando eu rodo com o npm run dev tes:integration como o livro mandou me aparece esse erro:
       
      > api-loja-virtual@1.0.0 test:integration /home/ed/projeto/api-loja-virtual
      > NODE_ENV=test mocha --opts test/integration/mocha.opts test/integration/**/*_spec.js
      /home/ed/projeto/api-loja-virtual/node_modules/mocha/lib/cli/options.js:209
            throw new Error(`Unable to read ${filepath}: ${err}`);
            ^
      Error: Unable to read test/integration/mocha.opts: Error: ENOENT: no such file or directory, open 'test/integration/mocha.opts'
          at loadMochaOpts (/home/ed/projeto/api-loja-virtual/node_modules/mocha/lib/cli/options.js:209:13)
          at loadOptions (/home/ed/projeto/api-loja-virtual/node_modules/mocha/lib/cli/options.js:310:22)
          at Object.<anonymous> (/home/ed/projeto/api-loja-virtual/node_modules/mocha/bin/mocha:29:14)
          at Module._compile (internal/modules/cjs/loader.js:776:30)
          at Object.Module._extensions..js (internal/modules/cjs/loader.js:787:10)
          at Module.load (internal/modules/cjs/loader.js:643:32)
          at Function.Module._load (internal/modules/cjs/loader.js:556:12)
          at Function.Module.runMain (internal/modules/cjs/loader.js:839:10)
          at internal/main/run_main_module.js:17:11
      npm ERR! code ELIFECYCLE
      npm ERR! errno 1
      npm ERR! api-loja-virtual@1.0.0 test:integration: `NODE_ENV=test mocha --opts test/integration/mocha.opts test/integration/**/*_spec.js`
      npm ERR! Exit status 1
      npm ERR! 
      npm ERR! Failed at the api-loja-virtual@1.0.0 test:integration script.
      npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
      npm ERR! A complete log of this run can be found in:
      npm ERR!     /home/ed/.npm/_logs/2019-07-18T23_16_05_549Z-debug.log
       
      oque pode ser ??
       
      segue o github para baixar o code: https://github.com/MAdMAX-io/API-loja-virtual
    • Por ppanetony
      Boa Tarde.
       
      Estou começando a usar o PHPUnit.
      Tenho uma static function para valida o numero do CPF retornando true ou false se o CPF for válido ou inválido, respectivamente.
      Usei essa static funcion para fazer os testes com o PHPUnit.
       
      O código abaixo está funcionando corretamente, mas gostaria de saber se ele está com muitos ou poucos testes, se os testes estão bem elaborados, o que pode ser melhorado, melhores práticas para a criação destes testes...
      Enfim...
      Quem puder opinar, agradeço muito!
       
      Não coloquei a static function que valida o cpf, para deixar o foco somente no código dos testes...
       
      Obrigado.
       
      <?php use PHPUnit\Framework\TestCase; use Validators\Documents as Cpf; const VALID_CPF_WITH_ONLY_DIGITS = '70996162003'; const VALID_CPF_WITH_FORMATTED_DIGITS = '709.961.620-03'; const INVALID_CPF_WITH_ONLY_DIGITS = '70996162002'; const INVALID_CPF_WITH_FORMATTED_DIGITS = '709.961.620-02'; const INVALID_CPF_WITH_ALL_DIGITS_EQUALS = '11111111111'; const INVALID_CPF_WITH_LESS_THAN_ELEVEN_DIGITS = '7099616200'; const INVALID_CPF_WITH_MORE_THAN_ELEVE_DIGITS = '709961620030'; final class ValidatorCpfTest extends TestCase { public function testIsValidCpfWithOnlyDigits() { $this->assertTrue(Cpf\ValidatorCpf::checkOver(VALID_CPF_WITH_ONLY_DIGITS)); } public function testIsValidCpfWithFormattedDigits() { $this->assertTrue(Cpf\ValidatorCpf::checkOver(VALID_CPF_WITH_FORMATTED_DIGITS)); } public function testIsNotValidCpfWithOnlyDigits() { $this->assertFalse(Cpf\ValidatorCpf::checkOver(INVALID_CPF_WITH_ONLY_DIGITS)); } public function testIsNotValidCpfWithFormattedDigits() { $this->assertFalse(Cpf\ValidatorCpf::checkOver(INVALID_CPF_WITH_FORMATTED_DIGITS)); } public function testInvalidCpfWithAllDigitsEquals() { $this->assertFalse(Cpf\ValidatorCpf::checkOver(INVALID_CPF_WITH_ALL_DIGITS_EQUALS)); } public function testInvalidCpfWithLessThanElevenDigits() { $this->assertFalse(Cpf\ValidatorCpf::checkOver(INVALID_CPF_WITH_LESS_THAN_ELEVEN_DIGITS)); } public function testInvalidCpfWithMoreThanEleveDigits() { $this->assertFalse(Cpf\ValidatorCpf::checkOver(INVALID_CPF_WITH_MORE_THAN_ELEVE_DIGITS)); } }  
    • Por dineresc
      Galera, estou usando o RSpec pra teste em um projeto rails,  e ao dar um 
      expect(response).to redirect_to(:controller => "clients") ele me volta "Expected response to be a redirect to <http://test.host/clients> but was a redirect to <http://test.host/login>"..
       
      ou seja, preciso evitar o filtro. alguém sabe como? Obrigado desde já!
    • Por TheNet
      Olá pessoal tudo bem?

      Estou tentando usar o PHPUnit junto ao Selenium Server só que está ocorrendo um problema que não estou conseguindo arrumar.
       
      O erro:
       
      PHP Warning:  require_once(vendor/phpunit/phpunit-selenium/Selenium2TestCaseTest.php): failed to open stream: No such file or directory in /var/www/html/test/testSelenium.php on line 2
      PHP Fatal error:  require_once(): Failed opening required 'vendor/phpunit/phpunit-selenium/Selenium2TestCaseTest.php' (include_path='.:/usr/share/php') in /var/www/html/test/testSelenium.php on line 2
       
      Agradeço desde já!
       
    • Por wambertof
      Olá Pessoal,
      Sou novo por aqui e me perdoem se cometer algum equivoco,
      Estou querendo usar "Selenium" em php para pegar dados de um site, mas para isso preciso configurar algumas coisas no meu pc(windows), dentre elas instalar o PHPUnit, só que estou encontrando dificuldade para isso, já pesquisei em vários tutoriais, inclusive do proprio phpunit (https://phpunit.de/)%C2'> e não obtive exito,
      Obs.: uso o xamp em meu PC.
      Algum dos colegas teria algo que indicasse como faria a instalação do phpunit dentro do windows para me indicar.
      Grato pela atenção
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.