Cakephp 如何测试从模型调用的CakeEmail
在CakePHP 2.1中,我试图测试是否使用正确的“to”电子邮件从我的模型测试用例中调用CakeEmail::to()方法(在本例中:cat@gmail.com) 我希望通过以下测试,但我得到:Cakephp 如何测试从模型调用的CakeEmail,cakephp,testing,phpunit,Cakephp,Testing,Phpunit,在CakePHP 2.1中,我试图测试是否使用正确的“to”电子邮件从我的模型测试用例中调用CakeEmail::to()方法(在本例中:cat@gmail.com) 我希望通过以下测试,但我得到: Expectation failed for method name is equal to <string:to> when invoked 1 time(s). Method was expected to be called 1 times, actually called 0 t
Expectation failed for method name is equal to <string:to> when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.
调用1次时,方法名称等于的预期失败。
方法应被调用1次,实际调用0次。
以下是模型和测试用例中的代码:
<?php
// Model/Job.php
App::uses('AppModel', 'Model');
App::uses('CakeEmail', 'Network/Email');
class Job extends AppModel {
public function emailCat() {
$CakeEmail = new CakeEmail();
$CakeEmail->to('cat@gmail.com');
$CakeEmail->subject('hello!');
$CakeEmail->emailFormat('text');
$CakeEmail->config('default');
$CakeEmail->send('hi');
}
}
// Test/Model/JobTest.php
class JobTestCase extends CakeTestCase {
public function setUp() {
parent::setUp();
$this->Job = ClassRegistry::init('Job');
}
public function testEmailCat() {
// I want to assert CakeEmail::to() is called with correct email
$CakeEmail = $this->getMock('CakeEmail' , array('to'));
$CakeEmail->expects($this->once())
->method('to')
->with($this->equalTo('cat@gmail.com'));
$result = $this->Job->emailCat();
}
}
问题在于,您模拟的是一个与模型上实际使用的类完全不同的类。在模型函数中,实例化一个全新的电子邮件类,该类将被模拟。相反,您需要确保模型使用的CakeEmail
对象是模拟对象
class Job extends AppModel {
public $CakeEmail = null;
public function emailCat() {
if (!$CakeEmail) {
$this->CakeEmail = new CakeEmail();
}
$this->CakeEmail = new CakeEmail();
$this->CakeEmail->to('cat@gmail.com');
$this->CakeEmail->subject('hello!');
$this->CakeEmail->emailFormat('text');
$this->CakeEmail->config('default');
$this->CakeEmail->send('hi');
}
}
然后更新测试用例,在作业模型上设置模拟对象
class JobTestCase extends CakeTestCase {
public function setUp() {
parent::setUp();
$this->Job = ClassRegistry::init('Job');
}
public function testEmailCat() {
// I want to assert CakeEmail::to() is called with correct email
$CakeEmail = $this->getMock('CakeEmail' , array('to'));
$CakeEmail->expects($this->once())
->method('to')
->with($this->equalTo('cat@gmail.com'));
// use mock object instead of creating a brand new one
$this->Job->CakeEmail = $CakeEmail;
$result = $this->Job->emailCat();
}
}
对谢谢阅读依赖注入,并将重新分解一些位,以使测试更容易。非常感谢!您正在扼杀mvc,在模型中发送*封电子邮件您可以自由地扩展此评论-在规则手册中,它说应该从控制器发送电子邮件吗?从模型发送电子邮件没有问题。一些模型可以使用其他模型,并且范围更广,只要它们与控制器逻辑分离即可。它们被称为“域模型”,如果您知道如何使用它们,它们将非常强大。所以别担心,通过模型发送电子邮件并不是在破坏宇宙。但是,如果这能让您感觉更好的话,也许您可以调用另一个用于发送电子邮件的类。