php - Pact for PHP - 来自模拟服务器的 404 响应代码

标签 php api testing pact

我尝试使用示例配置为 PHP 配置 Pact。我的问题是我可以运行 mockServer,但我发出的每个请求都会返回 404 响应。当然,我像在 GitHub 自述文件中一样设置了所有内容。不过,我知道服务器是可见的(本地主机配置),但无法注册路由。

代码示例:

class PactTest extends \Tests\BaseTestCases\V2TestCase
{

/** @var MockServerConfig */
private $config;

public function setUp()
{
    // Create your basic configuration. The host and port will need to match
    // whatever your Http Service will be using to access the providers data.
    $this->config = new MockServerConfig();
    $this->config->setHost('localhost');
    $this->config->setPort(7200);
    $this->config->setConsumer('someConsumer');
    $this->config->setProvider('someProvider');
    $this->config->setHealthCheckTimeout(60);
    $this->config->setCors(true);

    // Instantiate the mock server object with the config. This can be any
    // instance of MockServerConfigInterface.
    $server = new MockServer($this->config);

    // Create the process.
    $server->start();

    // Stop the process.
    $server->stop();
}

public function testSimple()
{
    $matcher = new Matcher();

    // Create your expected request from the consumer.
    $request = new ConsumerRequest();
    $request
        ->setMethod('GET')
        ->setPath('/test/abc')
        ->addHeader('Content-Type', 'application/json');

    // Create your expected response from the provider.
    $response = new ProviderResponse();
    $response
        ->setStatus(200)
        ->addHeader('Content-Type', 'application/json;charset=utf-8')
        ->setBody([
            'message' => $matcher->term('Hello, Bob', '(Hello, )[A-Za-z]')
        ]);

    // Create a configuration that reflects the server that was started. You can
    // create a custom MockServerConfigInterface if needed. This configuration
    // is the same that is used via the PactTestListener and uses environment variables.
    $builder = new InteractionBuilder($this->config);
    $builder
        ->given('a thing exists')
        ->uponReceiving('a get request to /test/abc')
        ->with($request)
        ->willRespondWith($response); // This has to be last. This is what makes an API request to the Mock Server to set the interaction.

    $service = new HttpClientService($this->config->getBaseUri()); // Pass in the URL to the Mock Server.
    $result  = $service->getTestAbc(); // Make the real API request against the Mock Server.

    $builder->verify();

    self::assertEquals('Hello, Bob', $result); // Make your assertions.
}

getTestAbc() 是:

public function getTestAbc(): string
{
    $uri = $this->baseUri;
    $response = $this->httpClient->get("{$uri->getHost()}/test/abc", [
        'headers' => ['Content-Type' => 'application/json']
    ]);
    $body   = $response->getBody();
    $object = \json_decode($body);

    return $object->message;
}

我做错了什么?

最佳答案

您正在设置中停止模拟服务器。您应该在 tearDown 中的测试后停止服务器。我注意到这是手册中的代码,它可能具有误导性,但我认为它的目的是作为一个如何手动启动/停止模拟服务器的示例。

关于php - Pact for PHP - 来自模拟服务器的 404 响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53944082/

相关文章:

php - 将两个输入数组组合成一个数组以使用PHP输入数据库

php - 是不是所有的数据库都使用USE语句来切换数据库?

node.js - 使用 ng 服务器 Angular 6 运行脚本

api - 获取某人的 Steam 库存

支持 HTTP PATCH 的 REST 测试工具?

url - 如何设置******.domain.com

PHP:如何在运行时创建和注册类

大事件PHP推荐

mysql - SQLSTATE[HY000] : General error: 1364 Field 'name' doesn't have a default value, Laravel

c# - 测试工具与测试框架有何不同/