5

コントローラーをテストするときに認証コンポーネントをモックする方法を見つけましたが、コンポーネントをテストするときに認証コンポーネントをモックするのに苦労しています。Cakephp2.0 と phpUnit を使用しています。

::generate() を使用すると、Error: Call to undefined method TestCalendarController::generate が発生します。

認証コンポーネントの user() 関数をモックする方法はありますか? または、使用しないようにコンポーネントを書き直す必要がありますか?

ありがとう!

CalendarComponentTest

App::uses('Controller', 'Controller');
App::uses('CakeRequest', 'Network');
App::uses('CakeResponse', 'Network');
App::uses('ComponentCollection', 'Controller');
App::uses('CalendarComponent', 'Controller/Component');
App::uses('AuthComponent', 'Controller/Component');

class TestCalendarController extends Controller {

}

class CalendarComponentTest extends CakeTestCase {
    public $CalendarComponent = null;
    public $Controller = null;

public function setUp() {
        parent::setUp();
        // Setup our component and fake test controller
        $Collection = new ComponentCollection();
        $this->CalendarComponent = new CalendarComponent($Collection);
        $CakeRequest = new CakeRequest();
        $CakeResponse = new CakeResponse();
        $this->Controller = new TestCalendarController($CakeRequest, $CakeResponse);
        $this->CalendarComponent->startup($this->Controller);
}

//Here I am trying to mock the Auth component. I've tried a number of different things, and I'm not getting anything to work.
public function testAdjust() {
    $TestCalendar = $this->Controller->generate('TestCalendar', array(
        'components' => array(
            'Auth' => array('user')
        )
    ));
    $TestCalendar->Auth->staticExpects($this->any())
        ->method('user')
        ->will($this->returnValue(array('id'=>1, 'timezone'=>'America/Los_Angeles', 'type'=>'student')));

    // Test our adjust method with different parameter settings
    $this->CalendarComponent->calculate_parameters();



}

 public function tearDown() {
      parent::tearDown();
      // Clean up after we're done
      unset($this->CalendarComponent);
      unset($this->Controller);
  }


} 
4

1 に答える 1

1

私は同じ問題を抱えており、可能な解決策を見つけました。少なくともそれは私にとってはうまくいきます。

ヒントを得るために、cakephp 自体のテスト ケース、特に AuthComponent のテスト ケースhttps://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/に注目しました。コンポーネント/AuthComponentTest.php

たとえば、他のコンポーネントのモックが含まれているようです。

$this->Auth->Session = $this->getMock('SessionComponent', array('renew'), array(), '', false);

あなたの場合、次のようなものを使用する必要があります。

$this->CalendarComponent->Auth = $this->getMock('Auth', array('user'));
$this->CalendarComponent->Auth->expects($this->any())->method('user')->with('id')->will($this->returnValue($user_id));
于 2013-05-10T18:53:40.880 に答える