wiremock-php/wiremock-php

WireMock JSON 接口的 PHP API

2.35.1 2023-01-15 15:52 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 中是静态的方法是实例方法。这些方法是:

  • 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。如果PHPUnit包含在包含路径中,这将是一个PHPUnit_Framework_AssertionFailedError的子类,从而使得任何包含的PHPUnit测试失败;如果PHPUnit不在包含路径中,VerificationExceptionException的子类。