wiremock-php / wiremock-php
WireMock JSON 接口的 PHP API
Requires
- php: >=7.2
- ext-curl: *
- ext-json: *
Requires (Dev)
- hamcrest/hamcrest-php: ^2.0
- phake/phake: ^4.2
- phpdocumentor/reflection-docblock: ^5.3
- phpdocumentor/type-resolver: ^1.6
- phpunit/phpunit: ^8.5
Suggests
- phpunit/phpunit: Thrown VerificationExceptions automatically fail tests
This package is auto-updated.
Last update: 2024-09-15 20:00:14 UTC
README
使用 PHP 通过 WireMock 的力量模拟和验证 Web 服务。
WireMock 提供了一个 JSON API 用于与其交互;wiremock-php 通过包装成一个类似于 WireMock 提供的 Java API 的流畅 API,使得从 PHP 中使用该 JSON API 变得非常容易。
注意:wiremock-php 需要运行一个独立的 WireMock 实例(这需要 Java)。
版本号跟踪 WireMock 本身的版本,但可能落后(例如,如果 WireMock 的发布版本没有包含 API 的更改,则可能没有对应的 wiremock-php 版本)。
替代方案
喜欢模拟和验证 HTTP 请求的想法,但不喜欢这个库(可能你不想安装 Java)?你可能想调查以下
安装
最简单的安装 wiremock-php 的方法是使用 Composer
php composer.phar require --dev wiremock-php/wiremock-php:2.35.0
用法
API
API 直接基于 WireMock 的 Java API,因此请参阅 WireMock 文档 以获取与 WireMock 交互的一般帮助。
与 Java API 的区别
为了提供一个流畅的接口,WireMock Java API 使用静态导入的方法(作用于默认的静态实例),但也可以直接作用于 Java WireMock 实例(使用略微不同的方法名称)。
在 5.6 版本之前(wiremock-php 创建的时候),PHP 不支持类似于 Java 的方法静态导入。因此,在 wiremock-php 中,一些在 Java 中是静态的方法是实例方法。这些方法是:
stubFor
、editStub
、importStubs
verify
get
、post
、put
、delete
、patch
、head
、options
、trace
、any
- 所有各种匹配器方法
getAllServeEvents
、findAll
、findUnmatchedRequests
、findNearMissesFor
、findNearMissesForAllUnmatched
listAllStubMappings
、getSingleStubMapping
、findStubsByMetadata
、removeStubsByMetadata
saveAllMappings
reset
、resetToDefault
resetAllRequests
、removeServeEvent
、removeServeEvents
、removeEventsByStubMetadata
getAllScenarios
、resetAllScenarios
、resetScenario
、setScenarioState
setGlobalFixedDelay
、setGlobalRandomDelay
、resetGlobalDelays
startRecording
、getRecordingStatus
、stopRecording
、snapshotRecord
shutdownServer
此外,Java API 有方法(ResponseDefinitionBuilder::withBody
和 WebhookDefinition::withBinaryBody
)接受字节数组。字节数组在 PHP 中不太常见,因此提供了 withBodyData
方法,它接受一个要 base64 编码的字符串。要从字节数组生成适当的字符串,请使用 pack。
日期和时间请求匹配函数(before
、beforeNow
、equalToDateTime
、isNow
、after
、afterNow
)可以与偏移量(expectedOffset($amount, $unit)
)一起使用。在Java API中,单位参数是一个枚举;在wiremock-php中,这些值是DateTimeMatchingStrategy
上的常量。同样,截断类型(用于与truncateExpected
和truncateActual
一起使用)在Java API中是枚举,但在wiremock-php中是DateTimeMatchingStrategy
上的常量。
stubImport
方法在Java中的StubBuilder
上是静态的。在WireMock中,为了将所有公共静态方法放在一个可预测的地方,此方法作为WireMock::stubImport
提供。
请求方法常量在WireMock\Http\RequestMethod
上可用。
此外,wiremock-php添加了实例方法isAlive
。它轮询独立的WireMock实例,直到收到OK响应或达到超时,允许您的PHP代码等待WireMock准备好。
示例
典型用法可能如下所示
// Create an object to administer a WireMock instance. This is assumed to be at // localhost:8080 unless these values are overridden. $wireMock = WireMock::create(/* specify host, port here if needed */); // Assert that the standalone service is running (by waiting for it to respond // to a request within a timeout) assertThat($wireMock->isAlive(), is(true)); // Stub out a request $wireMock->stubFor(WireMock::get(WireMock::urlEqualTo('/some/url')) ->willReturn(WireMock::aResponse() ->withHeader('Content-Type', 'text/plain') ->withBody('Hello world!'))); // ... interact with the server ... // Verify a request $wireMock->verify(WireMock::postRequestedFor(WireMock::urlEqualTo('/verify/this')) ->withHeader('Content-Type', WireMock::equalTo('text/xml')));
验证PHPUnit集成
如果验证失败,将抛出VerificationException
。如果PHPUnit包含在包含路径中,这将是一个PHPUnit_Framework_AssertionFailedError
的子类,从而使得任何包含的PHPUnit测试失败;如果PHPUnit不在包含路径中,VerificationException
是Exception
的子类。