【问题标题】:Unit testing date sensitive functions?单元测试日期敏感功能?
【发布时间】:2010-10-17 20:40:13
【问题描述】:

我正在尝试为日期助手类编写测试。我想知道对此的最佳做法是什么。
这是一个 PHP 示例。

    public static function get_date($offset = 0){
        $date = mktime(0, 0, 0, date('m')  , date('d') + $offset, date('Y'));
        return array(
            'day'   => date('D',$date),
            'month' => date('M',$date),
            'year'  => date('Y',$date)
        );
    }

    public static function today(){
        return self::get_date();
    }

    public static function tomorrow(){
        return self::get_date(1);
    }

    public static function yesterday(){
        return self::get_date(-1);
    }

所以我要寻找的是可以测试这些函数的测试示例,或者是一种编写这些函数的新方法,以便直观地测试它们。

我在 Java 中找到了示例,但它们看起来很不优雅,而且我真的不了解 Java,除非您将 Actionscript 3 视为 Java ;)

Javascript 或 Ruby 中的解决方案作为示例也非常有用,但我的课程是用 PHP 编写的,所以这将是理想的。

谢谢!

【问题讨论】:

    标签: php javascript ruby unit-testing


    【解决方案1】:

    我通常会这样做:

    <?php
    
    class Date
    {
        protected $date;
    
        public function __construct($date = null)
        {
            $this->date = $date ? $date : time();
        }
    
        public function today()
        {
            // to something with $this->date
        }
    }
    
    
    class DateTest extends PHPUnit_Framework_TestCase
    {
        public function testToday()
        {
            $date = new Date(strtotime('2010-10-17 00:00:00'));
            $this->assertEquals($expectedValue, $date->today());
        }
    }
    

    它遵循与date() 相同的原则,即接收第二个可选参数,即参考时间。

    【讨论】:

    • 我想保持函数静态。怎么想?
    • 静态方法在单元测试领域被视为禁忌,因为它使依赖于它们的代码难以测试。另一件事是,使用实例方法,您在 API 中声明,除非构造函数成功执行,否则无法使用某个方法。因此,您可以在构造函数中进行验证并相应地抛出异常。使用静态方法,您没有构造函数的等价物。
    • 我不知道静态方法不受欢迎。我喜欢将它们用作我的助手。那好吧。再见静态方法...:(你好更容易测试写作:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多