如何使用PHPUnit模拟SimpleXMLElement对象?

时间:2014-07-02 15:00:26

标签: php mocking phpunit simplexml

要对一个类进行单元测试,我想创建一个SimpleXMLElement对象的模拟。不幸的是,我无法弄清楚如何做到这一点。我通常会这样做:

class XmlTest extends PHPUnit_Framework_TestCase
{
    public function testSimpleXmlMock()
    {
        $mock = $this
            ->getMockBuilder('SimpleXMLElement')
            ->disableOriginalConstructor()
            ->getMock();

        $this->assertInstanceOf('SimpleXMLElement', $mock);
    }
}

此公式适用于模拟其他类(例如DOMDocument),但它不适用于SimpleXMLElement。运行测试会产生以下错误:

1) XmlTest::testSimpleXmlMock
unserialize(): Node no longer exists

我正在使用PHPUnit 4.1.3。我在模拟构建器上尝试了各种选项组合,包括将XML字符串作为参数传递给构造函数,但无法找到有效的组合。

如何创建模拟SimpleXMLElement对象?

1 个答案:

答案 0 :(得分:2)

“SimpleXMLElement”类是“Traversable”接口的实现。您可以轻松地模拟它,依赖注入可以基于接口......它不是理想的解决方案,但它可以工作。

private function getMockSimpleXmlElement()
{
    $mock = $this
        ->getMockBuilder('Traversable')
        ->getMock();

    return $mock;
}

否则你应该创建一个包装你需要的“SimpleXMLElement”的类和功能的类......然后注入包装类。