【问题标题】:Zend Framework/PHPUnit: How to Stub/Mock an object method that connects to a database?Zend Framework/PHPUnit:如何存根/模拟连接到数据库的对象方法?
【发布时间】:2011-03-05 01:25:19
【问题描述】:

在我的 Zend Framework 项目中,我有一个正在测试的表单。在我的表单中,多选元素从模型中获取其选项,模型从数据库中检索它们。

public function init()
{
    $this->addElement('select', 'Region_ID', array('multiOptions' => $this->getRegions()));
}

protected function getRegions()
{
    $mapper = new Model_RegionMapper();
    return $mapper->getFormSelectData(); //this method will try to connect to a database (or get another object that will connect to the database)
}

我尝试复制 PHPUnit 文档中的示例,但它似乎不起作用。

public function setUp()
{
    $stub = $this->getMock('Model_RegionMapper');
    $stub->expects($this->any())
        ->method('getFormSelectData')
        ->will($this->returnValue(array('testdata')));
}

public function testFoo()
{
    //this will fail
    $form = new My_Form();
}

测试失败,因为它试图在数据库中查找一个不存在的表。但我根本不希望它连接到数据库。如何正确存根/模拟此方法以使其不调用数据库?

【问题讨论】:

    标签: zend-framework phpunit mocking stub


    【解决方案1】:

    模拟 Model_RegionMapper。

    • 不要在您的类中构造 Model_RegionMapper,而是将其传入。
    • 测试时,传入一个虚假的 Model_RegionMapper,它会返回 getFormSelectData() 的测试数据。

    【讨论】:

      【解决方案2】:

      我同意 Sjoerd 的观点,因为在这种情况下,您正在测试您的表单,而不是如何检索数据,只需创建一个模拟对象并使用您希望在这种情况下收到的信息设置它的返回值。 PHPUnit Mock Objects 的一个很好的替代品是Mockery by Padraic O'Brady。这是一种替代品。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 1970-01-01
        • 2017-06-27
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        • 2019-04-06
        相关资源
        最近更新 更多