如何为SOAP服务器编写PHPUnit测试?

时间:2018-04-19 08:15:18

标签: testing soap phpunit

UPD。对不起大家。 我有一个充当SOAP服务器的应用程序,如何编写PHPUnit测试来测试它?

1 个答案:

答案 0 :(得分:2)

SOAP扩展是从PHP输入流中读取数据。您只需在那里提供自己的数据,并为您的API创建一些集成/单元测试。

查看SoapServer::handle()方法的签名。它将一个字符串作为参数,这是一个请求本身。此参数是可选的,如果您没有传递任何内容,PHP将只读取数据本身。但你可以简单地覆盖它。

我用流来做。首先,使用您自己的类包装SoapServer,如下所示:

class MyServer
{
    /** \SoapServer */
    private $soapServer;

    public function __construct(\SoapServer $soapServer)
    {
        $this->soapServer = $soapServer;
    }

    public function handle(Psr\Http\Message\StreamInterface $inputStream): void
    {
        $this->soapServer->handle($inputStream->getContent());
    }
}

现在您已准备好模拟请求。

在您的测试中,您可以这样做:

class MyTest extends TestCase
{
    public function testMyRequest(): void
    {
        $mySoapServer = $this->createMySoapServer();
        $request = $this->createRequest();

        $mySoapServer->handle($request);
    }

    private function createRequest(): StreamInterface
    {
        $requestString = '<soap:Envelope></soap:Envelope>';

        $fh = fopen('php://temp', 'rw');
        fwrite($fh, $requestString);
        fseek($fh, SEEK_SET);

        return new Psr\Http\Message\StreamInterface\Stream($fh);
    }

    private function createMySoapServer(): MyServer
    {
        return new MyServer(new \SoapServer());
    }
}

要记住一件事 - 此测试将生成输出。您可能想要测试此输出或忽略它。取决于您的用例。

另一方面说明。您所要求的与PHPUnit无关。这只是正确设计SOAP服务器的问题。

如果您想知道如何在有实时请求时设置流,这非常简单:

$server->handle(new Psr\Http\Message\StreamInterface\Stream(fopen('php://input', 'r+')));