【问题标题】:Mocking the AuthComponent in a Component Unit Test with Cakephp使用 Cakephp 在组件单元测试中模拟 AuthComponent
【发布时间】:2013-03-11 14:44:09
【问题描述】:

我已经知道如何在测试我的控制器时模拟 Auth 组件,但是在测试我的组件时我很难模拟 Auth 组件。我正在使用 cakephp2.0 和 phpUnit。

当我使用 ::generate() 时出现错误:调用未定义的方法 TestCalendarController::generate。

有没有办法模拟 Auth 组件 user() 函数?还是我需要重写组件以避免使用它?

谢谢!

日历组件测试

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


} 

【问题讨论】:

  • 我对控制器的解决方案感兴趣 - 你能给出一个简短的例子或链接吗?

标签: unit-testing cakephp phpunit


【解决方案1】:

我有同样的问题并找到了可能的解决方案,至少它对我有用。

为了获得一些提示,我将注意力集中在 cakephp 本身的测试用例上,尤其是 AuthComponent https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2012-02-27
    • 1970-01-01
    • 2020-04-05
    • 2018-12-21
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多