Zend framework Zend Framework/PHPUnit:如何存根/模拟连接到数据库的对象方法?

Zend framework Zend Framework/PHPUnit:如何存根/模拟连接到数据库的对象方法?,zend-framework,phpunit,mocking,stub,Zend Framework,Phpunit,Mocking,Stub,在我的Zend框架项目中,我有一个正在测试的表单。在我的表单中,multi-select元素从模型中获取其选项,模型从数据库中检索这些选项 public function init() { $this->addElement('select', 'Region_ID', array('multiOptions' => $this->getRegions())); } protected function getRegions() { $mapper = new

在我的Zend框架项目中,我有一个正在测试的表单。在我的表单中,multi-select元素从模型中获取其选项,模型从数据库中检索这些选项

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

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

模拟Model\u RegionMapper

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

我同意Sjoerd的观点,因为在本例中,您是在测试表单,而不是如何检索数据,只需创建一个模拟对象,并使用您在这种情况下希望接收的信息设置其返回值。PHPUnit模拟对象的一个很好的替代方法是。这是一个替代品