2

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

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

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

4

3 回答 3

1

请注意,我是 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);
}
于 2014-02-12T01:21:41.967 回答
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);
于 2013-09-09T11:46:06.927 回答
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 分析器轻松找出在特定操作中实例化了哪些类,甚至实例化了多少次。无需手动测试!

于 2013-09-06T16:43:40.587 回答