写入REST_PRE_SERVE_REQUEST的集成测试

时间:2018-06-07 作者:dingo_d

我有一个方法rest_api_init

  /**
   * Set allowed headers for the rest request
   */
  public function set_allowed_rest_headers() {

    remove_filter( \'rest_pre_serve_request\', \'rest_send_cors_headers\' );

    add_filter(
      \'rest_pre_serve_request\', function( $value ) {
        header( \'Access-Control-Allow-Origin: \' . esc_url_raw( \'some url pulled from options\' ) );
        header( \'Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE, PATCH\' );
        header( \'Access-Control-Allow-Credentials: true\' );

        return $value;
      }
    );
  }
我想用phpunit.

我已经创建了一个测试用例

<?php
/**
 * Class Test_Admin
 *
 * @package test
 */

/**
 * Class that tests the REST functionality.
 */
class Test_Rest extends WP_UnitTestCase {
  /**
   * Initial set up for the test
   */
  public function setUp() {
    parent::setUp();

    /**
     * Global $wp_rest_server variable
     *
     * @var WP_REST_Server $wp_rest_server Mock REST server.
     */
    global $wp_rest_server;

    $wp_rest_server = new \\WP_REST_Server();
    $this->server   = $wp_rest_server;

    do_action( \'rest_api_init\' );

  }

  /**
   * Tear down after test ends
   */
  public function tearDown() {
    parent::tearDown();

    global $wp_rest_server;
    $wp_rest_server = null;

  }

  /**
   * Test if the REST API headers are set
   *
   * @since 1.1.0
   */
  public function test_allowed_rest_headers() {

    $request  = new WP_REST_Request( \'GET\', \'/wp/v2/posts\' );
    $response = $this->server->dispatch( $request );

    $this->assertEquals( 200, $response->get_status() );

    $headers  = $request->get_headers();
    $headers2 = $response->get_headers();
    error_log( print_r( $headers, true ) );
    error_log( print_r( $headers2, true ) );
  }
}
断言响应是200 正在通过,但error_log 对请求标头不返回任何内容,并且

Array
(
    [X-WP-Total] => 0
    [X-WP-TotalPages] => 0
)
对于响应标头。但我需要测试一下Access-Control-Allow-* 标题设置正确。

如何做到这一点(除了在单元测试期间手动设置)?

我试着打电话给set_allowed_rest_headers() 方法,但什么都没有。

1 个回复
SO网友:Mark Kaplun

这个问题实际上与wordpress无关,但也许值得回答。

该示例中没有您自己的代码可以/值得测试,因此没有太多需要进行单元测试的地方。

让我们看看细节。add_filter 与核心代码集成,remove_filter 与核心代码和header 是与PHP核心的集成。如果删除了所有这些行,则只剩下零代码。

或者换一种说法,上面提到的三个函数正在改变全局状态,而不是您的内部状态,虽然您可能能够构建一个相关的测试,但最终您将测试它们,而不是测试您自己的代码。

这里需要的是集成测试,用代码设置wordpress实例,发送api请求并检查结果。

结束

相关推荐