在我的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();
}
测试失败,因为它试图在数据库中找到一个不存在的表。但我根本不希望它连接到数据库。如何正确存根/模拟此方法以使其不调用数据库?
答案 0 :(得分:3)
模拟Model_RegionMapper。
答案 1 :(得分:0)
我同意Sjoerd,因为在这种情况下,您正在测试您的表单,而不是如何检索数据,只需创建一个模拟对象并使用您希望收到的信息设置它的返回值在那种情况下。 PHPUnit模拟对象的一个很好的替代方法是Mockery by Padraic O'Brady。这是另类选择。