我想使用模拟测试控制器。
在我的控制器中
public function myAction() {
$email = new MandrillApi(['template_name'=>'myTemplate']);
$result = $email
->subject('My title')
->from('no-reply@test.com')
->to('dest@test.com')
->send();
if ( isset($result[0]['status']) && $result[0]['status'] === 'sent' )
return $this->redirect(['action' => 'confirmForgotPassword']);
$this->Flash->error(__("Error"));
}
在测试中
public function testMyAction() {
$this->get("users/my-action");
$this->assertRedirect(['controller' => 'Users', 'action' => 'confirmForgotPassword']);
}
如何模拟MandrillApi类?谢谢
答案 0 :(得分:2)
在你的控制器测试中:
public function controllerSpy($event){
parent::controllerSpy($event);
if (isset($this->_controller)) {
$MandrillApi = $this->getMock('App\Pathtotheclass\MandrillApi', array('subject', 'from', 'to', 'send'));
$this->_controller->MandrillApi = $MandrillApi;
$result = [
0 => [
'status' => 'sent'
]
];
$this->_controller->MandrillApi
->method('send')
->will($this->returnValue($result));
}
}
一旦控制器设置正确,controllerSpy方法将插入模拟对象。您不必调用controllerSpy方法,在测试中进行$this->get(...
调用后,它会在某个时刻自动执行。
显然你必须改变模拟代的App\Pathtotheclass
部分以适应你的MandrillApi类的位置。