shiishiji / wiremock-php
WireMock JSON接口的PHP API
Requires
- php: >=8.0
- ext-curl: *
- ext-json: *
- symfony/property-access: ^5.4
- symfony/property-info: ^5.4
- symfony/serializer: ^5.4
Requires (Dev)
- hamcrest/hamcrest-php: ^2.0
- phake/phake: ^4.2
- phpunit/phpunit: ^8.5
Suggests
- phpunit/phpunit: Thrown VerificationExceptions automatically fail tests
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)?你可能想调查以下内容
安装
通过Composer安装wiremock-php是最简单的。
php composer.phar require --dev shiishiji/wiremock-php:2.33.1
用法
API
该API直接基于WireMock的Java API,因此请参阅WireMock文档以获取与WireMock交互的一般帮助。
与Java API的区别
为了提供一个流畅的接口,WireMock Java API使用了静态导入的方法(作用于默认静态实例),但它也可以直接作用于Java WireMock实例(使用略有不同的方法名称)。
在版本5.6之前(wiremock-php创建的时候),PHP不支持Java的静态方法导入。因此,在wiremock-php中,一些在Java中是静态的方法在PHP中是实例方法。这些方法是
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
异常。如果 include 路径上存在 PHPUnit,这将是一个 PHPUnit_Framework_AssertionFailedError
的子类,从而导致任何包含的 PHPUnit 测试失败;如果不存在 PHPUnit,VerificationException
将是 Exception
的子类。