1

CakePHP 2.1では、CakeEmail :: to()メソッドがモデルのテストケースから正しい「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 times.

モデルとテストケースのコードは次のとおりです。

<?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();
        }

}
4

1 に答える 1

3

問題は、モデルで実際に使用されているクラスとは完全に異なるクラスをモックしていることです。モデル関数で、モックされる新しい電子メールクラスをインスタンス化します。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();
        }

}
于 2012-07-17T15:01:19.807 に答える