【发布时间】:2012-04-13 07:46:51
【问题描述】:
我正在为我的控制器编写一些单元测试 (PHPUnit 3.6),并希望验证正确的操作等正在被触发。这很容易。然而,一些控制器还通过不希望的模型执行某些操作,例如将记录插入数据库。
我知道我需要模拟这些,但不清楚如何做到这一点。以下面的示例控制器为例(为了清楚起见,删减了):
public function addAction()
{
$data = $this->getRequest()->getPost();
$model = $this->getModelFactory()->getCompetitionModel()->insert($data); }
}
注意,我要做的只是验证正确的控制器和动作是否已被调度,但不希望实际插入记录。同样,我有删除等的等价物。我不希望实际删除记录。
这里实际上需要嘲笑什么?竞争模型、数据库适配器、模型工厂,还是三者兼而有之?我该如何注射这些?我已经尝试过(再次为简洁起见):
public function testAddActionIsDispatched()
{
$this->request->setMethod('POST');
$this->request->setPost(array($data…));
$modelMock = $this->getMockBuilder('Competition_Adder')
->disableOriginalConstructor()
->getMock();
$factoryMock = $this->getMockBuilder('ModelFactory')
->disableOriginalConstructor()
->getMock();
// Configure the stub.
$factoryMock->expects($this->any())
->method('getCompetitionModel')
->will($this->returnValue($modelMock));
$modelMock->expects($this->once())
->method('insert')
->will($this->returnValue(true));
$this->dispatch('/mymodule/add/');
$this->assertController('test');
$this->assertAction('add');
$this->assertResponseCode(200);
}
}
我的理解是 PHPUnit 神奇地用模拟替换了对原始的任何引用,以便在调用调度时使用假模拟代替它们。这不会发生。有人可以澄清这是如何实现的吗?
【问题讨论】:
标签: php zend-framework mocking phpunit