【问题标题】:PHPUnit testing singletonPHP单元测试单例
【发布时间】:2015-02-09 00:25:21
【问题描述】:

我正在尝试为我们使用 PHPUnit 的一些非常古老的代码编写测试。我在这里给出了它的粗略结构,我正在尝试测试它从 ClassA 继承的 ClassB 的 isMember() 方法。它应该只是检查类中是否存在常量值。

我遇到的问题是它显然是一个受保护的构造函数,所以我不知道如何测试它,因为我在 PHPUnit 中不断收到受保护的构造错误,因为显然构造函数是受保护的。请告知我如何测试这个?

abstract class ClassA implements InterfaceA {

    private $mValueList;
    protected static $instance;

    protected function __construct() {

    }

    protected static function getInstance(ClassA $obj) {
        if (is_null($obj->instance)) {
            $obj->instance = $obj;
        }
        return $obj->instance;       
    }

    public function isMember($value) {
        return isset($this->mValueList[$value]);
    }

    ....more methods......

}

class ClassB extends ClassA {

    public static function getInstance() {
        return parent::getInstance(new self());
    }

    const CON1 = 'string1';
    const CON2 = 'string2';
}

【问题讨论】:

    标签: php unit-testing testing singleton phpunit


    【解决方案1】:

    您可以像测试任何其他类一样对其进行测试,只是不要在测试中使用构造函数。

    public function testIsMember() {
        $classB = ClassB::getInstance();
        $this->assertTrue($classB->isMember('string1'));
        $this->assertFalse($classB->isMember('foo'));
    }
    

    我正在对断言进行猜测,您可以重构测试以使用数据提供程序。但总体思路是一样的。您不会在单例测试中直接调用构造函数。 getInstance 方法替换了对构造函数的调用。

    【讨论】:

    • 我知道这是一个老问题,但我需要指出你的答案是不正确的。问题是,如果你只是简单地测试一个单例,你会将数据从一个测试泄漏到另一个测试。什么是真正的破坏者。因此,您需要一种用于测试目的的方法才能重置单例。像 setInstance() 这样的东西。在 setUp() 方法中,您将实例存储在测试对象中,在 tearDown 中您将其设置回来
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2012-01-08
    • 1970-01-01
    • 2015-11-17
    • 2020-09-03
    • 2017-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多