你能测试没有功能的型号吗?

时间:2012-05-24 02:08:32

标签: php unit-testing cakephp phpunit cakephp-2.0

这不是我要问的问题,因为有些东西被打破了。更多的是我想知道在这种情况下该怎么做。

如果我写了以下模型,

class Amenity extends AppModel {

    var $name = 'Amenity';
     /**
     * Behaviors used by the Model
     *
     * @var array
     * @access public
     */

    var $hasAndBelongsToMany = array(
            'RoomFlat' =>
                array(
                     'className'              => 'RoomFlat',
                     'joinTable'              => 'amenities_room_flats',
                     'foreignKey'             => 'amenity_id',
                     'associationForeignKey'  => 'room_flat_id',


                )
        ); 

    var $actsAs = array(        
        'Multivalidatable'
    );  
    /**
     * Custom validation rulesets
     */ 
    var $validationSets = array(
       'admin'=>array(
          'name'=>array(                        
             'notEmpty'=>array(
                        'rule'=>'notEmpty',
                        'message'=>'This  is required'        
                        ),
             'isUnique'=>array(
                        'rule'=>'isUnique',
                        'message'=>'This already exists.'
                        )   
            ),
        )
    );
}

我还写了以下装置

class AmenityFixture extends CakeTestFixture {
    public $fields = array(
        'id' => array('type' => 'integer', 'key' => 'primary'),
        'name' => array('type' => 'text', 'null' => 'false'),
        'status' => array('type' => 'tinyint', 'null' => 'false'),
        'created' => array('type' => 'datetime', 'null' => 'false'),
        'modified' => array('type' => 'datetime', 'null' => 'false')
    );

    public function init(){ 
        $this->records = array(
            array('id' => 1, 'name' => 'amenity fixture 1', 'status'=>'1', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 2, 'name' => 'amenity fixture 2', 'status'=>'0', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 3, 'name' => 'amenity fixture 3', 'status'=>'1', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 4, 'name' => 'amenity fixture 4', 'status'=>'0', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
            array('id' => 5, 'name' => 'amenity fixture 5', 'status'=>'1', 'created' => date('Y-m-d H:i:s'), 'modified' => date('Y-m-d H:i:s')),
        );
        parent::init();
    }

}

测试它的最佳方法是什么?我在模型中没有任何功能可以测试吗?这种情况你真的不会对任何东西进行单元测试吗?如果你告诉我为此写一个测试套件,你会怎么做我的?

我也在使用cakePHP,是的,我已经阅读了测试页面(http://book.cakephp.org/2.0/en/development/testing.html)。但我真的想要理解为什么要做的事情而不是如何做。如果有人可以推荐任何好书或文章,那也会有所帮助。

如果我需要发布任何其他详细信息,请告诉我。

3 个答案:

答案 0 :(得分:2)

你的问题在评论中得到了很好的回答,但为了清楚起见,这里是一个答案。

这是您没有对模型进行任何测试的情况。大多数情况下,您只需要测试一个对象的公共方法,而这里没有任何公共方法。如果您有这样的方法:

class Amenity extends AppModel
{
    public function doSomething($one, $two, $three)
    {
        // ...
    }
}

然后,您需要使用$one$two$three的不同组合编写测试。但是测试Model::find()方法等模型函数没有任何意义,因为它们被蛋糕自己的测试所覆盖。

最后,我将从评论中引用deceze

  

所有业务逻辑都应该表示为模型方法。

这是一个非常重要的概念,无论是测试还是清晰度。

有关详情,请参阅:fat modelsskinny controllers

答案 1 :(得分:0)

当然你可以测试那些模型。因为实际上,他们有方法(他们的父模型)。

但是,只有涵盖基础知识(读/写)才有意义。断言表是否正确设置等 - 所以可能有一些save()和find()测试。 您也可以测试正确设置关系(在您的情况下为HABTM)或您的验证规则。

蛋糕测试可能已经涵盖了其他所有内容。

答案 2 :(得分:0)

当谈到Cakephp时,可以/应该对其他两个方面进行单元测试:

  • 验证规则
  • 模特的关系

为什么?因为如果模型中的任何字段名称或类型更改,它将检测代码回归

我特别关注输入命名 assert(),因为当然会发生回归(多个开发人员,多个版本),否则您将很难检测到这一点

希望这有帮助!