2
class Documentation
{
    private $_text;

    public function __construct($text)
    {
        $this->_text = $text;
    }

    public function generate()
    {
        return new \DOMElement('documentation', $this->_text);
    }
}

私が考えることができる明らかな解決策は、新しいものを作成し、関数呼び出しDOMDocumentの結果を追加し、generate()を使用して期待される要素と比較すること$this->assertEqualXMLStructureですが、何らかの理由で私はそれが好きではなく、代替手段があると確信しています。

何か案は?

UPD:何か重要なことを見逃しているようです。確認したいのは、特定のコンテンツを持つ特定のタイプの要素が返されることです。どうやってするか?

UPD 2

これは私が現在作成できるものですが、醜いですね。

public function testGenerate()
{
    $expected = new \DOMDocument();
    $expected->loadXML('<?xml version="1.0" encoding="utf-8"?><documentation>foo</documentation>');

    $documentation = new Documentation('foo');
    $actual = new \DOMDocument('1.0', 'utf-8');
    $actual->appendChild($documentation->generate());

    $this->assertEqualXMLStructure($expected, $actual);
}
4

1 に答える 1

5

これは非常に単純なクラスなので、問題が発生する可能性はほとんどありません。コードには分岐がまったくなく、すべてのメソッドの循環的複雑度は 1 です。このような単純なクラスのテスト スイートを作成する必要はまったくありません。

ただし、PHPUnit を使用して、generate() メソッドが DOMElement オブジェクトを返し、その要素の子ノードがテキスト オブジェクトであり、テキスト オブジェクトが入力テキストと一致することをアサートできます。

あまり意味がありません。

EDIT TO ADD:これは、テストを実行するためのメソッドの例です(テストランナーとしてPHPUnitを想定しています)。テストされていないため、構文が間違っている可能性がありますが、テスト手順のアイデアが得られるはずです。

ご覧のとおり、このメソッドはテスト対象のクラスよりも長くなっています。私は単体テストの大ファンですが、この特定のケースではやり過ぎのようです。達成しなければならないコード カバレッジ クォータがない限り、または特に用心深く、クラスに関して何らかの保証が必要でない限り、この特定のケースでは気にしません。

public function testGenerate ()
{
    $expected = 'The quick brown fox jumps over the lazy dog';
    $this -> object = new Documentation ($expected);
    $actual = $this -> object -> generate ();

    // Check we got a DOM Element object
    $this -> assertInstanceOf ('\DOMElement', $actual);

    // Check that our DOM element is of the Documentation type
    $this -> assertEquals ('documentation', $actual -> tagName);

    // Check that our Documentation element has a single text node child
    $this -> assertEquals (1, $actual -> childNodes -> length);
    $this -> assertInstanceOf ('\DOMText', $actual -> firstChild);

    // Check that the text node has the value we passed in originally
    $this -> assertEquals ($expected, $actual -> firstChild -> wholeText);
}
于 2012-10-16T07:34:11.890 に答える