2012-10-16 44 views
2
class Documentation 
{ 
    private $_text; 

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

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

明显的解决方案,我能想到的是创造新的DOMDocumentgenerate()函数调用的结果追加和使用$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

我会编写一个测试,看看是否创建了类,并测试是否返回生成的Domelement实例。 – JvdBerg

+0

也许还有另一个至少要检查某些特定元素是否被包含 – Havelock

+0

@JvdBerg:“如果一个Domelement的实例返回生成” - 显然这还不够。作为一个烟雾测试 - 是的,作为一个单元测试 - 我怀疑。 – zerkms

回答

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

“,并且该元素的子节点是文本对象,并且该文本对象与输入文本匹配。” ---这就是问题所在。怎么做? ;-) – zerkms

+0

见修正案。 – GordonM

+0

@GordonM我认为这回答了这个问题,我同意你的提议(我想这个问题是对一个更复杂情况的简化)。看看你的代码,OP的'assertEqualXMLStructure'版本看起来既短又脆(不使用'childNodes','firstChild'等)。你有什么想法? –