【问题标题】:Testing controller on CakePHP2.0 which calls model functions在 CakePHP 2.0 中测试调用模型函数的控制器
【发布时间】:2012-04-13 11:00:32
【问题描述】:

这是我的测试:

public function testIncludeNumComment() {
    $post = array(...stuff.....);
    $result = $this->Comments->includeNumComments($post);
    echo "end"; //this is not printed
    $expected =1;

    $this->assertEquals($result, $expected);
}

那么,我的控制器功能就是这个:

public function includeNumComments($post){
        echo "printed";
    $comments = $this->Comment->getNumComments($post['Post']['id']);
    echo "not printed";

    return $comments;
}

如您所见,控制器上对模型函数的调用不起作用

$this->Comment->getNumComments($idPost);

更重要的是,当我在 Comment 模型中的 getNumComments 函数的最开始引入 echo "hi"; 时,它也不会打印出来。 这就像它没有找到功能或类似的东西。 (但在测试过程中没有按屏幕显示任何错误)

它停在那里,不再执行更多代码。 我完全确定该函数运行良好,它只是从帖子中返回 cmets 的数量。问题是:为什么它在测试用例上不起作用?

谢谢。

更新: 测试设置如下所示:

public function setUp() {
    parent::setUp();

    $this->Comments = new TestCommentsController();
    $this->Comments->constructClasses();

}

【问题讨论】:

  • 核心 (>=2.0) 现在默认隐藏输出。但它还包含一种再次为您的测试启用调试输出的方法。您需要将 &debug=1 附加到测试套件中的 url(dereuromark.de/2011/12/04/unit-testing-tips-for-2-0-and-phpunit 提到了另一种解决方案)。
  • 我现在已经完成了。我没有看到任何变化。它仍然没有显示模型上的 getNumComments 函数内的打印。
  • 错字?为什么$this->Comments-> 而不是正确的$this->Comment->
  • Cake Bake 命令创建了这样的测试。 CommentsController、Comment 模型和 Comments 视图是我的结构。
  • 我刚刚为您更新了问题,以查看测试用例中的 setUp 是如何定义的。

标签: cakephp testing model controller cakephp-2.0


【解决方案1】:
$result = $this->Comments->includeNumComments($post);

如果您的模型是“评论”,这没有多大意义

所以改成:

$result = $this->Comment->includeNumComments($post);

【讨论】:

  • 测试不是调用模型,测试是调用控制器。我正在测试控制器。然后,控制器用这个函数调用模型:getNumComments
  • 啊,我明白了——对不起,我以前并不清楚。不过,您的控制器方法看起来很奇怪。它不应该返回这个数组,而是为它渲染一些视图。也许这在某种程度上是相关的。
  • 它不渲染任何视图,它只是一个将数据返回给另一个视图的函数。
  • 好的,你是蛋糕新手:你应该把它保护起来(_include...)或者更好的方法:让它成为一个模型方法。无论如何,它不应该在控制器中。只有“可见”的动作应该在那里。
  • 我无法将其设为模型方法,因为它使用修改它的数组进行操作。它不仅仅是一个要返回的查询。那么,我应该在哪里写呢?我认为控制器是应用程序的逻辑......这就是我的功能:逻辑。
【解决方案2】:

检查您是否包含TestCommentsController,如下所示:

App::uses('TestCommentsController', 'Controller');

然后在AppController 中写入beforeFilter 函数,如下所示:

class AppController extends Controller {
    ......
    ...
    public function beforeFilter() {
      // you stuff
    }
}

然后将其添加到包含test 函数的控制器中:

    public function beforeFilter(){
       parent::beforeFilter();
       $this->Comments = new TestCommentsController();
       $this->Comments->constructClasses();
   }

.....

现在继续……

   public function testIncludeNumComment() {
      $post = array(...stuff.....);
      $result = $this->Comments->includeNumComments($post);
      echo "end"; //this is not printed
      $expected =1;

      $this->assertEquals($result, $expected);
  }

【讨论】:

  • 我应该把 App::uses 放在哪里?在什么文件中?评论控制器测试?还有 beforeFilter 函数?在哪个班?
  • @Steve 哪个控制器包含测试功能?
  • App/Test/Cases/Controller/CommentsControllerTest.php 里面有2个类:TestCommentsController和CommentsControllerTestCase。测试在类 CommentsControllerTestCase
  • 好像不行。我在 TestCommentsController 有 beforeFilter 函数,其余的就像你说的那样。
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
相关资源
最近更新 更多