nivseb / php-mock-server-connector

这是一个小工具,可以方便地从基于PHP的测试中轻松使用mock-server/mockserver。

dev-main / 1.x-dev 2024-07-12 22:55 UTC

This package is auto-updated.

Last update: 2024-09-12 23:27:56 UTC


README

Tests Supported PHP Version Latest Stable Version Total Downloads

PHP Mock Server Connector是一个工具,它使您能够轻松地在基于PHP的测试中使用MockServer。其利用方法基于Mockery项目。因此,期望的创建非常相似。

安装

  1. 要安装PHP Mock Server Connector,您可以使用composer轻松完成。
    composer require --dev nivseb/php-mock-server-connector
  2. 您需要一个正在运行的MockServer实例。
  3. 现有的基于PHP的测试设置。例如,使用PHPUnit的设置。

使用方法

在测试中进行设置

安装完成后,您现在可以在测试中使用连接器。现在第一步是连接到MockServer实例,为此,请将以下代码添加到您的测试中。这可以在单个测试用例中完成,也可以在测试的另一个设置部分中完成(例如,PHPUnit测试中的setUp方法)。但这是第一个需要执行的操作。

    use Nivseb\PhpMockServerConnector\Server;
    MockServer::init('https://your_mock_server.localhost');

接下来必须添加的部分是以下代码。它必须在测试之后添加,例如在PHPUnit测试的tearDown方法中。此代码将验证您的MockServer实例中的期望。

    use Nivseb\PhpMockServerConnector\Server;
    MockServer::close();

对于PHPUnit测试,该软件包包含一个名为UseMockServer的特质。这为测试类添加了两个方法:initMockServer和closeMockServer。closeMockServer方法在PHPUnit测试的tearDown中调用。现在,您的集成可以看起来像这样

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use PHPUnit\Framework\TestCase;
    
    class YourTest extends TestCase {
        use UseMockServer;
        
        protected function setUp(): void
        {
            parent::setUp();
            $this->initMockServer('https://your_mock_server.localhost');
        }
    }

创建期望

完成测试用例的设置后,您现在可以向测试中添加期望。首先,您必须为端点创建一个实例。该端点是mock的路由入口点。这种设计允许您使用单个MockServer实例为不同的其他外部API构建mock。

    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;

    $mockServer = new MockServerEndpoint('/rootPath');

对于您希望mock的每个请求,您现在将调用allows方法。这将为您提供一个PendingExpectation,这将创建在您的MockServer实例中的期望,在析构时或调用run方法时。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    $mockServer = new MockServerEndpoint('/rootPath');
    
    $mockServer->allows('GET', '/firstPath')->andReturn(200, ['data' => 'This is a JSON test content.']);
    // OR
    $myRequest = $mockServer->allows('GET', '/secondPath');
    $myRequest->andReturn(200, ['data' => 'This is a JSON test content.']);
    $myRequest->run();

期望将在关闭mock服务器时进行验证,有关详细信息,请参阅在测试中进行设置

支持请求期望

方法和URI

您可以为所有可能的组合创建方法和路径的期望,这些组合都可以使用MockServer

参数

要为期望添加参数检查,您可以使用方法withPathParameters或withQueryParameters。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    // Expected: /test/myExpectedPath?myQueryParameter=myExpectedValue
    $mockServer = new MockServerEndpoint('/test');
    $mockServer
        ->allows('GET', '/{myPathParameter}')
        ->withPathParameters(['myPathParameter' => 'myExpectedPath'])
        ->withQueryParameters(['myQueryParameter' => 'myExpectedValue']);

请求头

您可以通过在待处理期望上调用withHeaders方法来添加预期的头。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    $mockServer = new MockServerEndpoint('/test');
    $mockServer->allows('GET', '/')->withHeaders(['myHeader' => 'myExpectedValue']);

可以通过调用withBody方法期望请求体。体可以以数组或字符串的形式发送。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    $mockServer = new MockServerEndpoint('/test');
    $mockServer->allows('GET', '/')->withBody(['data' => 'This is a JSON test content.']);

多次调用

使用times方法,您可以定义请求应该执行多次。

响应

期望的响应可以通过使用andReturn方法来定义。对于响应,您可以定义状态码、正文和头部信息。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    $mockServer = new MockServerEndpoint('/test');
    $mockServer->allows('GET', '/')->andReturn(200, ['data' => 'This is a JSON test content.']);

默认值

每个期望都带有一些默认值。此示例将定义,请求只执行一次,并返回状态码为200的空响应。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    $mockServer = new MockServerEndpoint('/');
    $mockServer->allows('GET', '/');

示例

这里有一个完整的PHPUnit测试用例的示例。

    use Nivseb\PhpMockServerConnector\PhpUnit\UseMockServer;
    use Nivseb\PhpMockServerConnector\PhpUnit\MockServerEndpoint;
    use PHPUnit\Framework\TestCase;
    use GuzzleHttp\Client;
    
    class ExampleTest extends TestCase {
        use UseMockServer;
        
        protected function setUp(): void
        {
            parent::setUp();
            $this->initMockServer('https://your_mock_server.localhost');
        }

        public function testMyRequest() : void {
            $mockServer = new MockServerEndpoint('/rootPath');
            $mockServer->allows('GET', '/mySubPath')->andReturn(200, ['data' => 'This is a JSON test content.'])
            
            $client = new Client(['base_uri' => 'https://your_mock_server.localhost/rootPath'])
            $response = $this->client->get('/mySubPath');
            
            self::assertEquals(200, $response->getStatusCode());
            self::assertEquals('{"data":"This is a JSON test content."}',$response->getBody()->getContents());
        }
    }