UPD。对不起大家。 我有一个充当SOAP服务器的应用程序,如何编写PHPUnit测试来测试它?
答案 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+')));