Интеграционное тестирование плагина WordPress, который требует выполнения composer и npm - PullRequest
0 голосов
/ 06 июня 2018

Я пишу интеграционные тесты для плагина, и я сделал все, используя wp-cli и скаффолдинг тесты.И они работают нормально, когда я бегу phpunit.Но проблема у меня заключается в том, что я использую composer и npm - composer для некоторых дополнительных функций и npm для объединения моих скриптов.

Часть скриптов важна, потому что я ставлю в очередьскрипты из папки public (папка сборки)

$main_script = 'public/scripts/application.js';

wp_register_script( 'plugin-scripts', plugin_dir_url( __DIR__ ) . $main_script, array() );

wp_enqueue_script( 'plugin-scripts' );

Мне нужно проверить, не поставлены ли в очередь мои скрипты и стили, поэтому я добавил тест

public function test_enqueued_scripts() {
    $this->admin->enqueue_styles();
    $this->assertTrue( wp_script_is( 'plugin-scripts' ) );
}

$this->admin isпросто экземпляр класса, где мой метод enqueue находится в методе setUp().

И я получаю сообщение об ошибке, потому что оно говорит, что Failed asserting that false is true.

Плагин, который я тестирую, построени композитор установлен.Все папки существуют, и все работает, когда я нахожусь на моем экземпляре WordPress.Но тестовый экземпляр не совпадает с моим локальным экземпляром (ofc).Я error_log редактировал метод enqueue, чтобы проверить, если file_exist, и я получаю false.

Мне нужно проверить это с помощью phpunit (требования клиентов должны иметь полное покрытие тестирования).

Мой bootstrap.php выглядит следующим образом

<?php
/**
 * PHPUnit bootstrap file
 *
 * @package Plugin
 */

$_tests_dir = getenv( 'WP_TESTS_DIR' );

if ( ! $_tests_dir ) {
  $_tests_dir = rtrim( sys_get_temp_dir(), '/\\' ) . '/wordpress-tests-lib';
}

if ( ! file_exists( $_tests_dir . '/includes/functions.php' ) ) {
  echo "Could not find $_tests_dir/includes/functions.php, have you run bin/install-wp-tests.sh ?" . PHP_EOL;
  exit( 1 );
}

// Give access to tests_add_filter() function.
require_once $_tests_dir . '/includes/functions.php';

/**
 * Manually load the plugin being tested.
 */
function _manually_load_plugin() {
  // Update array with plugins to include ...
  $plugins_to_active = array(
      'advanced-custom-fields-pro/acf.php',
      'my-plugin/my-plugin.php',
  );

  update_option( 'active_plugins', $plugins_to_active );

  require dirname( dirname( dirname( __FILE__ ) ) ) . '/advanced-custom-fields-pro/acf.php';
  require dirname( dirname( __FILE__ ) ) . '/my-plugin.php';
}
tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );

// Start up the WP testing environment.
require $_tests_dir . '/includes/bootstrap.php';

Как я могу запустить процесс сборки (npm run build), чтобы мои сценарии существовали до моих модульных тестов?Также возможно ли запускать этот этап сборки только один раз, а не один раз каждый раз, когда я запускаю phpunit?

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Вам нужно запустить do_action('wp_enqueue_scripts') до выполнения ваших утверждений. Эта статья содержит более подробную информацию и пример.Итак, ваш тест должен выглядеть следующим образом:

public function test_enqueued_scripts() {
    $this->admin->enqueue_styles();
    do_action('wp_enqueue_scripts');
    $this->assertTrue( wp_script_is( 'plugin-scripts' ) );
}

Я протестировал это решение, и оно работает.

0 голосов
/ 06 июня 2018

Очень простым решением было бы проверить файл, который npm создает с file_exists() в вашей начальной загрузке.

Если это не так, запустите сборку с shell_exec()

http://php.net/manual/en/function.file-exists.php

http://php.net/manual/en/function.shell-exec.php

...