Tag: unit

  • 重构“任氏有无轩”——第四天

    好吧,我忏悔:今天的内容很少,根本不是一天的内容。但是,考虑到今天是周末啊…… 今天我只是开始做一些分页构件的准备工作。

    ========

    分页当然很重要。但是在Symfony 1.4之前,其提供的Paginator构件其实并不很恰当:它融合了相关数据集返回、构造实际的导航条这两个本来一个属于M,一个属于V的工作。按照Quick-and-Dirty的原则来说,这样做也无可厚非,只是会破坏Synfony一直推崇的MVC分离的原则。

    所以,回头一想,如果开发者要自己开发一个Paginator就会很简单:获得相关的数据集由M去完成。这个步骤中的一个关键是获得符合筛选条件的总记录数,我们当然不能傻乎乎的将所有记录返回然后count一遍,应该在数据库服务器端就完成这个统计。由于今天我们不是做M端,也不是做V端——啊?那我们今天讲虾米?!——所以我会另开一文。

    今天只是准备工作:测试。

    按照TDD的思路,在实现一个功能之前,就先描述好这个功能应该获得什么输入,得到什么输出是非常好的习惯。

    在分页模块中,有一个功能是必须实现的,即:已知总记录数(n),每页显示记录数(rpp),需要知道总共要多少页(p)。 一般的算法就是p=ceil(n/rpp)。但是这样的算法对不对?比如,如果总记录数正好是每页记录数的整数倍,那会不会出问题? 对于这种验证,用单元测试就会很方便。 首先编写Paginator类,其中有一个函数是getTotalPages

    // srctrrsywxBundleUtilityPaginator.php
    namespace trrsywxBundleUtility;
    class Paginator
    {
        private $page;
        private $total;
        private $style;
        public function __construct()
        {
            $this->page = 1;
        }
        /*
         * var recCount: the total count of records
         * var $rpp: the record per page
         */
        public function getTotalPages($recCount, $rpp)
        {
            if ($rpp == 0)
            {
                $rpp = 20; //This is forced in this. Need to get parameter from configuration
            }
            $r = ceil($recCount / $rpp);
            return $r;
        }
    }

    然后创建对应的测试单元软件:

    // srctrrsywxBundleTestsUtilityPaginatorTest.php
    namespace trrsywxBundleTestsUtility;
    use trrsywxBundleUtilityPaginator;
    class PaginatorTest extends PHPUnit_Framework_TestCase
    {
        public function testGetTotalPage()
        {
            $paginator = new Paginator;
            $r = $paginator->getTotalPages(1, 0);
            $this->assertEquals(1, $r);
            $r = $paginator->getTotalPages(10, 20);
            $this->assertEquals(1, $r);
            $r = $paginator->getTotalPages(20, 20);
            $this->assertEquals(1, $r);
            $r = $paginator->getTotalPages(21, 20);
            $this->assertEquals(2, $r);
            $r = $paginator->getTotalPages(100, 20);
            $this->assertEquals(5, $r);
            $r = $paginator->getTotalPages(110, 20);
            $this->assertEquals(6, $r);
            $r = $paginator->getTotalPages(110, 10);
            $this->assertEquals(11, $r);
        }
    }

    在命令行中,运行如下命令:

    phpunit -c app srctrrsywxBundleTestsUtility

    如果一切顺利,那么就会得到:OK (1 test, 7 assertions)这样的提示。否则,就一定是某个用例下出了问题,需要针对这样的问题进行处理。

    【本文收录于[go4pro.org]