【问题标题】:Unit testing singleton pattern method __clone() in phpphp中的单元测试单例模式方法__clone()
【发布时间】:2011-03-02 04:17:12
【问题描述】:

我目前正在对我制作的自定义类进行单元测试,该类基于singleton 设计模式。根据代码覆盖率报告,我已经覆盖了 95.45%。我正在使用PHPUnit 进行单元测试,我已经通过this article 塞巴斯蒂安·伯格曼(Sebastian Bergmann)。

我剩下的唯一问题是通过魔术方法__clone() 测试类克隆。我已将该方法设置为私有以避免实例化

private final function __clone()
{}

编写测试以确保单例不可“克隆”的最佳方法是什么。 (同样的测试最终可以用来测试__constructor()

这不是一个真正的问题,但只是我的问题,或者与 *nix 盒子相比,Windows 盒子上的测试运行速度非常慢?

【问题讨论】:

    标签: php unit-testing design-patterns singleton phpunit


    【解决方案1】:

    请记住,代码覆盖率并不是衡量程序正确程度的标准,100% 的覆盖率也不意味着您已经执行了每条代码路径。比如三元运算符

    a ? b : c
    

    和复合布尔表达式

    if (a < 1 || b > 6)
    

    被视为单个语句,即使由于短路您可能只执行其中的一部分。此外,省略单个语句 ifwhile 等块周围的大括号会将整个内容变成单个语句。

    以下将在代码覆盖率报告中显示为单个语句,因此您无法判断您是否执行了这两种情况(truefalse)。

    if (...)
        foo();
    

    我觉得

    private final function __clone() { }
    

    太简单了,不会失败。测试该方法是否引发异常(使用反射,您的客户不会这样做)正在测试 PHP 解释器——超出了我书中的范围。

    [作为记录,在达到 100% 的代码覆盖率时,我也有一点 OC,但牢记上述事实有助于缓解这种情况,以便我可以继续编写更好的代码。]

    【讨论】:

    • 感谢您指出这些问题。我在单元测试的“第二层”中使用代码覆盖率,首先我尝试让每个测试路径覆盖的所有可能情况,最后我检查代码覆盖率,这可能会指出无用的代码(或看起来干净但冗余的回退)没有用的)。
    【解决方案2】:

    调用克隆或构造函数并检查是否抛出异常。

    【讨论】:

    • 它使用反射类和 try/catch 感谢您的快速回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2015-10-21
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多