在CakePHP控制器测试中访问模型

时间:2012-11-21 13:42:49

标签: unit-testing cakephp cakephp-2.0

我是CakePHP的新手,我刚刚开始编写我的第一个测试。通常使用Ruby on Rails,我测试Controller :: create动作的方法是调用create动作,然后比较调用之前和之后的模型数量,确保它增加1。

有人会以其他方式测试吗?

是否有一种简单的(内置)方法可以从CakePHP中的ControllerTest访问模型?我在源代码中找不到任何内容,并且通过Controller访问它似乎是错误的。

3 个答案:

答案 0 :(得分:2)

请注意,我是CakePHP的新手但是带着这个问题来到这里。这就是我最终做的事情。

我从@amiuhle得到了我的想法,但我只是在setUp中手动完成,就像他们在http://book.cakephp.org/2.0/en/development/testing.html的模型测试中提到的那样。

public function setUp() {
    $this->Signup = ClassRegistry::init('Signup');
}

public function testMyTestXYZ() {
    $data = array('first_name' => 'name');
    $countBefore = $this->Signup->find('count');
    $result = $this->testAction('/signups/add',
        array(
            'data' => array(
            'Signup' => $data)
        )
    );
    $countAfter = $this->Signup->find('count');
    $this->assertEquals($countAfter, $countBefore + 1);
}

答案 1 :(得分:1)

我最终做了这样的事情:

class AbstractControllerTestCase extends ControllerTestCase {
  /**
   * Load models, to be used like $this->DummyModel->[...]
   * @param array
   */
  public function loadModels() {
    $models = func_get_args();
    foreach ($models as $modelClass) {
      $name = $modelClass . 'Model';
      if(!isset($this->{$name})) {
        $this->{$name} = ClassRegistry::init(array(
          'class' => $modelClass, 'alias' => $modelClass
        ));
      }
    }
  }
}

然后我的测试继承自AbstractControllerTestCase,在$this->loadModels('User');中调用setUp,并且可以在测试中执行以下操作:

$countBefore = $this->UserModel->find('count');
// call the action with POST params
$countAfter = $this->UserModel->find('count');
$this->assertEquals($countAfter, $countBefore + 1);

答案 2 :(得分:0)

我不确定为什么有必要测试从控制器操作调用或实例化模型的次数。

所以,如果我测试Controller :: create ...我的ControllerTest将包含类似的内容:

testCreate(){
    $result = $this->testAction('/controller/create');
    if(!strpos($result,'form')){
        $this->assertFalse(true);
    }

    $data = array(
        'Article' => array(
            'user_id' => 1,
            'published' => 1,
            'slug' => 'new-article',
            'title' => 'New Article',
            'body' => 'New Body'
        )
    );
    $result = $this->testAction(
        '/controller/create',
        array('data' => $data, 'method' => 'post')
    );
    if(!strpos($result,'Record has been successfully created')){
        $this->assertFalse(true);
    }

}

您要测试的主要内容是您是否获得了输入的正确输出。您可以使用xDebug探查器轻松找出在特定操作中实例化的类甚至多少次。无需手动测试!