我有一个方法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()
方法,但什么都没有。
SO网友:Mark Kaplun
这个问题实际上与wordpress无关,但也许值得回答。
该示例中没有您自己的代码可以/值得测试,因此没有太多需要进行单元测试的地方。
让我们看看细节。add_filter
与核心代码集成,remove_filter
与核心代码和header
是与PHP核心的集成。如果删除了所有这些行,则只剩下零代码。
或者换一种说法,上面提到的三个函数正在改变全局状态,而不是您的内部状态,虽然您可能能够构建一个相关的测试,但最终您将测试它们,而不是测试您自己的代码。
这里需要的是集成测试,用代码设置wordpress实例,发送api请求并检查结果。