現在、値オブジェクトに基づいて XML を生成し、HTTP 経由で XML を送信し、XML 応答を解析して 2 番目の値オブジェクトに戻すクラスのテストに取り組んでいます。この場合、生成された XML と、特定の XML に基づいて解析された値オブジェクトをテストしたいと思います。
クラスは次のようになります。
class MyClient
{
public function send(RequestValues $request)
{
$document = $this->generateMessage($request);
$response = $this->request($document);
return $this->parseResponse($response);
}
protected function generateMessage(RequestValues $request)
{
$document = new DomDocument;
// Do stuff with $request
return $document;
}
public function request(DomDocument $document)
{
$client = $this->getHttpClient();
$client->setRawBody($document->saveXml());
// Configure client
return $client->send();
}
public function parseResponse(Response $response)
{
$parameters = new ResponseValues;
$document = new DomDocument;
$document->loadXml($response->getBody());
// Fill in $parameters
return $parameters;
}
}
私は2つのことをテストしたいと思います:
- 特定の
RequestValues
引数を指定すると、生成される XML は次のようになります。$string
- 特定の XML 応答値 (HTTP クライアントがモックされる) が与えられると、 は次の値
ResponseValues
に等しくなければなりません。$object
#1のテストを書いていますが、これはコールバックを介してのみ達成できると思います。ただし、テストが失敗した場合、コールバックはあまり有用な情報を提供しません。このメッセージのみ:
DOMDocument オブジェクト () が指定されたコールバックによって受け入れられることをアサートできませんでした。
テストは次のようになります。
public function testRequestContainsValidXml()
{
$client = $this->getMock('MyClient', array('request'));
$message = '';
$client->expects($this->once())
->method('request')
->with($this->callback(function($object) use ($message) {
return
($object instanceof DomDocument)
&& ($object->saveXml() === $message);
}));
$request = new DirectoryRequest;
$client->send($request);
}
問題は、通常の文字列比較ができるようにテストを改善するにはどうすればよいかということです。「文字列 X は Y と等しくない」という phpunit を取得したいと思います。これにより、デバッグが大幅に容易になります。
PS。このクラスの完全なコードは GitHub で入手できます。当然、上記の例は単純化されたバージョンです。実際のクラスは次のとおりです: https://github.com/juriansluiman/SlmIdealPayment/blob/master/src/SlmIdealPayment/Client/StandardClient.php#L58
PPS。テストするためにコードを変更する必要がある場合、それは問題ではありません。パブリック API を同じに保ちたいだけです (つまり、呼び出しResponseValues send(RequestValues $request)