首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从模型中调用测试CakeEmail

如何从模型中调用测试CakeEmail
EN

Stack Overflow用户
提问于 2012-07-17 21:05:43
回答 1查看 1.2K关注 0票数 1

在CakeEmail 2.1中,我尝试测试从我的模型测试用例中调用CakePHP::to ()方法时是否使用了正确的"to“电子邮件(在本例中为: cat@gmail.com)。

我希望下面的测试能够通过,但是我得到了:

代码语言:javascript
复制
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.

以下是模型和测试用例中的代码:

代码语言:javascript
复制
<?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();
        }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-17 23:01:20

问题是,您模拟的是一个与模型实际使用的类完全不同的类。在您的模型函数中,您实例化了一个全新的email类,该类将被模拟。相反,您需要确保模型使用的CakeEmail对象是模拟的对象。

代码语言:javascript
复制
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');
        }

}

然后更新您的测试用例以在Job模型上设置mock对象。

代码语言:javascript
复制
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();
        }

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11523135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档