shiishiji/wiremock-php

WireMock JSON接口的PHP API

2.33.1 2022-06-17 08:11 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)?你可能想调查以下内容

安装

通过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中是实例方法。这些方法是

  • stubForeditStubimportStubs
  • verify
  • getpostputdeletepatchheadoptionstraceany
  • 所有各种匹配器方法
  • getAllServeEventsfindAllfindUnmatchedRequestsfindNearMissesForfindNearMissesForAllUnmatched
  • listAllStubMappingsgetSingleStubMappingfindStubsByMetadataremoveStubsByMetadata
  • saveAllMappings
  • resetresetToDefault
  • resetAllRequestsremoveServeEventremoveServeEventsremoveEventsByStubMetadata
  • getAllScenariosresetAllScenariosresetScenariosetScenarioState
  • setGlobalFixedDelaysetGlobalRandomDelayresetGlobalDelays
  • startRecordinggetRecordingStatusstopRecordingsnapshotRecord
  • shutdownServer

此外,Java API有接受字节数组的方法(ResponseDefinitionBuilder::withBodyWebhookDefinition::withBinaryBody)。在PHP中,字节数组不太常见,因此提供了withBodyData方法,它接受要被base64编码的字符串。要从字节数组生成适当的字符串,请使用pack

日期和时间请求匹配函数(beforebeforeNowequalToDateTimeisNowafterafterNow)可以使用偏移量(expectedOffset($amount, $unit))与。在Java API中,单位参数是一个枚举;在wiremock-php中,这些值是DateTimeMatchingStrategy上的常量。类似地,截断类型(用于与truncateExpectedtruncateActual一起使用)在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 的子类。