Pregunta

El constructor de mi clase agrega una acción al gancho de acción '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);
    } 
}    

Estaba tratando de probar esto en una prueba unitaria y finalmente me di cuenta de que no había ninguna razón para que se activara el gancho de acción 'init'.¿Hay alguna forma de comprobar que se está llamando al método Register_my_type y que se está registrando un nuevo tipo de publicación?

Editar:

La principal fuente de mi confusión provino de no entender la relación entre phpunit, el conjunto de pruebas de WordPress, mi código de clase y mi código de prueba.

Lo que ahora entiendo es que con las herramientas de desarrollo de WordPress instaladas de la forma sugerida por este tutorial o a través de WP-CLI, una llamada a phpunit carga un archivo de arranque que luego conecta el complemento al muplugins_loaded gancho de acción.Luego, el archivo de arranque carga el entorno de prueba de WordPress.Después de que WordPress haya terminado de cargar el init se ejecuta el gancho.Código de complemento que hace uso de init debería funcionar como se esperaba.

Las pruebas son en su mayoría código normal que utiliza funciones o clases disponibles.Lo que los diferencia es que están escritos como métodos de una clase que se extiende WP_UnitTestCase que se extiende PHPUnit_Framework_TestCase.Estar envuelto en esta clase le da a las pruebas acceso a aserciones y fábricas de objetos, y ejecuta setUp y tearDown métodos para que cada prueba sea independiente de las demás.

¿Fue útil?

Solución

Permítanme comenzar diciendo que el init acción es Se llama cuando se carga WordPress, antes de ejecutar las pruebas.Entonces, si tiene su complemento/tema cargado con WordPress (conectándose a muplugins_loaded, por ejemplo), el register_my_type() Se debe llamar al método, si se llama a su constructor antes. init.(Si no estás cargando tu complemento de esa manera, echa un vistazo a este tutorial.)

Entonces, en tus pruebas unitarias deberías poder hacer esto:

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

También podrías usar get_post_type() para comprobar que el tipo de publicación se registró con los argumentos correctos.(Este es el mismo tipo de cosas que hago para verificar que mis códigos cortos estén registrados).

No me preocuparía intentar probar que se llamó al método, aunque puedes consultar la lista de acciones en $wp_actions para ver si estaba conectado correctamente.También puedes establecer una propiedad de clase como indicador cuando se llama, pero realmente creo que todo eso es excesivo.Cuando se trata de cosas enganchadas a acciones como init, especialmente una función como esta que solo necesita ejecutarse una vez, las pruebas funcionales son su mejor opción.Compruebe que hayan hecho lo que se supone que deben hacer, en lugar de centrarse en intentar probar una sola unidad, por ejemplo, si se llamó al método.

Dicho esto, también puedes probar que el método registre el tipo de publicación cancelando el registro del tipo de publicación y llamando manualmente al método.WordPress no parece proporcionar una deregister_post_type() función, por lo que tendrías que meterte con el $wp_post_types global directamente.Puede eliminar su tipo de publicación y luego llamar a su método y verificar si está registrado nuevamente.

Licenciado bajo: CC-BY-SA con atribución
scroll top