Pergunta

O construtor da minha classe adiciona uma ação ao gancho de ação 'init':

class My_Custom_Post_Type {

    function __construct( $type ) {
        $this->type = $type;
        add_action( 'init', array( $this, 'register_my_type' );
    }

    function register_my_type() {
        register_post_type( $this->type);
    } 
}    

Eu estava tentando testar isso em um teste de unidade e finalmente percebi que não havia razão para o gancho de ação 'init' disparar.Existe alguma maneira de testar se o método register_my_type está sendo chamado e se um novo tipo de postagem está sendo registrado?

Editar:

A principal fonte da minha confusão veio de não entender a relação entre o phpunit, o conjunto de testes do WordPress, meu código de classe e meu código de teste.

O que entendo agora é que com as ferramentas de desenvolvedor do WordPress instaladas da maneira sugerida por este tutorial ou através WP-CLI, uma chamada para phpunit carrega um arquivo de inicialização que então conecta o plugin ao muplugins_loaded gancho de ação.O arquivo bootstrap carrega o ambiente de teste do WordPress.Depois que o WordPress terminar de carregar o init o gancho é executado.Código do plugin que faz uso de init deve funcionar conforme o esperado.

Os testes são, em sua maioria, apenas código normal que faz uso de funções ou classes disponíveis.A diferença entre eles é que são escritos como métodos de uma classe que estende WP_UnitTestCase que se estende PHPUnit_Framework_TestCase.Estar envolvido nesta classe dá aos testes acesso a asserções e fábricas de objetos e executa setUp e tearDown métodos para que cada teste seja independente dos outros.

Foi útil?

Solução

Deixe-me começar dizendo que o init Ação é chamado quando o WordPress é carregado, antes da execução dos testes.Então, se você estiver carregando seu plugin/tema com o WordPress (conectando-se ao muplugins_loaded, por exemplo), o register_my_type() método deve ser chamado, se o seu construtor estiver sendo chamado antes init.(Se você não estiver carregando seu plugin dessa forma, dê uma olhada em este tutorial.)

Portanto, em seus testes de unidade, você poderá fazer isso:

$this->assertTrue( post_type_exists( 'my_post_type' ) );

Você também pode usar get_post_type() para verificar se o tipo de postagem foi registrado com os argumentos corretos.(Este é o mesmo tipo de coisa que faço para verificar se meus códigos de acesso estão registrados.)

Eu não me preocuparia em tentar testar se o método foi chamado, embora você pudesse verificar a lista de ações em $wp_actions para ver se estava conectado corretamente.Você também pode definir uma propriedade de classe como um sinalizador quando ela for chamada, mas eu realmente acho que tudo isso é um exagero.Quando se trata de coisas ligadas a ações como init, especialmente uma função como esta que só precisa ser executada uma vez, os testes funcionais são sua melhor aposta.Verifique se eles fizeram o que deveriam fazer, em vez de se concentrar em tentar testar uma única unidade, como se o método foi chamado.

Dito isso, você também pode testar se o método registra o tipo de postagem cancelando o registro do tipo de postagem e chamando o método manualmente.O WordPress não parece fornecer um deregister_post_type() função, então você teria que mexer com o $wp_post_types global diretamente.Você pode excluir seu tipo de postagem e então chamar seu método e verificar se ele está registrado novamente.

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