dongnai8013 2014-12-10 17:32
浏览 50

PHPUnit测试单例

I am trying to write a test for some very old code we have using PHPUnit. I've given the rough structure of it here, I am trying to test the isMember() method of ClassB which it inherits from ClassA. It should just be checking if a constant value exists in the class.

The problem I am having is that it is obviously a protected constructor, so I don't know how to test this as I keep getting protected contruct errors in PHPUnit as obviously the constructor is protected. Please advise how I test this?

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';
}
  • 写回答

1条回答 默认 最新

  • doucuodan0897 2014-12-11 15:10
    关注

    You would test it like any other class, you just don't use the constructor in the test.

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

    I am making a guess on the assertions and you could refactor the test to use a data provider. But the general idea is the same. You don't invoke the constructor directly in your tests for a singleton. The getInstance method replaces the call to the constructor.

    评论

报告相同问题?