【问题标题】:How would you write a test for such class?您将如何为此类课程编写测试?
【发布时间】:2012-10-16 07:27:44
【问题描述】:
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);
}

【问题讨论】:

  • 我会编写一个测试来查看类是否已创建,并编写一个测试来查看是否为生成返回了 Domelement 的实例。
  • 也许还有另一个检查至少包含某些特定元素的方法
  • @JvdBerg:“如果为生成返回了 Domelement 的实例”——显然这还不够。作为冒烟测试 - 是的,作为单元测试 - 我怀疑。

标签: php unit-testing testing phpunit


【解决方案1】:

这是一个如此简单的类,几乎没有任何可能出错的地方。代码中根本没有分支,所有方法的圈复杂度都是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);
}

【讨论】:

  • "并且该元素的子节点是一个文本对象,并且该文本对象与输入文本匹配。" --- 这就是问题所在。怎么做? ;-)
  • @GordonM 我认为这回答了这个问题,我同意你的附带条件(我想这个问题是对更复杂案例的简化)。查看您的代码,OP 的 assertEqualXMLStructure 版本似乎更短且不那么脆弱(没有使用 childNodesfirstChild 等)您的想法是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多