【问题标题】:Can you test models with no functions?你能测试没有功能的模型吗?
【发布时间】:2012-05-30 14:37:17
【问题描述】:

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

如果我写了以下模型,

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)。但我真的很想理解为什么做某事而不是如何做。如果有人可以推荐任何好书或文章,那也会有所帮助。

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

【问题讨论】:

  • 如果它没有任何功能 - 那么没有什么可测试的
  • 我会更好地为控制器编写一个测试,还是将保存和删除数据到/从数据库的逻辑移到模型中并移出它会更好控制器的?
  • 所有你的业务逻辑都应该用模型方法来表达。 “移除设施”是一项业务逻辑任务,应该在模型中有自己的方法,然后您可以使用单元测试对其进行测试。

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


【解决方案1】:

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

  • 验证规则
  • 模特的关系

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

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您的问题在 cmets 中得到了很好的回答,但为了清楚起见,这里有一个答案。

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

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

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

    最后,我要引用 cmets 的deceze

    你所有的业务逻辑都应该用模型方法来表达。

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

    有关更多信息,请阅读以下内容:fat modelsskinny controllers

    【讨论】:

      【解决方案3】:

      当然,您可以测试这些模型。因为实际上,它们确实有方法(它们的父模型)。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-16
        • 2011-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        相关资源
        最近更新 更多