jdgrimes / wp-http-testcase
用于测试涉及HTTP请求的WordPress代码的PHPUnit测试用例
Requires
- php: >=5.2.0
README
PHPUnit测试用例,用于测试使用WordPress的WP_Http
类的代码。
如果你在代码中使用wp_remote_request()
或其他WP_Http
方法的包装器,这将使得测试变得困难,尤其是如果远程服务器可能无法从你的测试环境中访问时。此测试用例通过让你将请求路由到不同的主机地址、使用缓存的响应集,或者通过提供人工响应来模拟远程响应来解决此问题。
安装
你可以使用composer安装此包
composer require --dev jdgrimes/wp-http-testcase
用法
要在你的代码中使用它,你需要首先在PHPUnit引导文件中包含wp-http-testcase.php
文件。(或者,为了利用Composer的自动加载,你可以只包含vendor/autoload.php
。)
然后,在你的涉及WP_Http
的测试中,你需要扩展WP_HTTP_TestCase
而不是通常的WP_UnitTestCase
。
模拟响应
使用响应缓存
在可能的情况下,测试的最佳方式是设置一个模拟主机来处理请求。在某些情况下,你可能希望或需要实际通过真实服务器发送请求,这也是可以做到的。你选择哪种方式将取决于请求的性质以及它们对目标主机产生的副作用。
设置测试主机
例如,如果你正在测试一个插件,该插件请求其他插件或软件提供的API,你可能不想或需要在实际网站上测试此功能。相反,你可以设置一个测试站点,或者使用你开发环境的一部分本地服务器。在那里,你可以安装处理请求的软件。一旦完成,你就可以像这样运行你的测试
WP_HTTP_TC_HOST=localhost phpunit
只需将localhost
替换为本地服务器的主机名。请注意,WP_HTTP_TC_*
标志可以作为PHP常量定义,也可以作为上面的bash环境变量定义。后者将优先。
启用缓存
当然,这会比大多数其他单元测试慢得多,因为请求需要花费一些时间。这就是缓存的作用所在。当启用缓存时,第一次运行请求时将缓存响应,并在将来使用缓存的版本。这意味着你的测试可以保持极快的速度。
要启用缓存,只需将其添加到你的引导文件中
define( 'WP_HTTP_TC_USE_CACHING', true );
你可能还希望通过WP_HTTP_TC_CACHE_DIR
指定保存缓存的位置。你可以利用多个缓存组,并通过使用WP_HTTP_TC_CACHE_GROUP
在它们之间切换。
使用实时主机
尽管如此,还有一种情况是您无法设置测试服务器。这种情况的一个例子是,如果您的插件需要请求GitHub提供的API。根据情况,实际请求“实时”接收者可能是可行的。再次出现的主要问题是,请求将使测试完成时间变长。还有可能,API在您的测试环境中并不总是可访问的,或者您的测试可能会对API造成过大压力,导致您被阻止。这时缓存可以帮助您。您只需要偶尔运行一次针对“实时”API的测试,其余时间可以使用缓存的响应进行测试。
提供人工响应
当然,有时候可能无法创建测试服务器,也无法在实时服务器上运行。在这种情况下,您可能希望将人工响应硬编码到测试中。以下是实现方法:
在调用将引发HTTP请求的代码之前,您需要将函数设置为模拟响应,如下所示:
$this->http_responder = array( $this, 'mock_server_response' );
HTTP响应函数将传递两个参数,即请求参数和请求的目标URL。
protected function mock_server_response( $request, $url ) { return array( 'body' => 'Test response.' ); }
有关$request
和响应参数的完整列表,请参阅WP_Http::request()
测试请求
您还可能希望测试代码是否按照预期发出请求。您可以通过检查$this->http_requests
的值来完成此操作,它是一个存储请求的数组。数组中的每个条目都存储请求参数('request'键)和URL('url'键)。
要检查是否已发出请求,您可以这样做:
$this->assertCount( 1, $this->http_requests ); $this->assertEquals( 'http://example.com/', $this->http_requests[0]['url'] );
当您只想测试请求而不关心响应时,您可以在请求发出之前通过将响应模拟器设置为__return_true()
来短路请求。
$this->http_responder = '__return_true'; my_prefix_make_request(); $this->assertCount( 1, $this->http_requests );