你会怎么为这样的课程写一个考试?

时间:2012-10-16 07:27:44

标签: php unit-testing testing phpunit

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);
}

1 个答案:

答案 0 :(得分:5)

这是一个如此简单的课程,几乎没有任何可能出错的课程。代码中根本没有分支,并且所有方法都具有1的圈复杂度。实际上没有必要为这样一个简单的类编写测试套件。

但是,您可以使用PHPUnit断言generate()方法返回DOMElement对象,并且该元素的子节点是文本对象,并且文本对象与输入文本匹配。

真的没有太多意义。

编辑添加:这是进行测试的示例方法(假设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);
}