PHPUnit:如何使用类实例化来测试方法?

时间:2015-03-27 18:10:43

标签: phpunit

我有一个简单的类:

class Subject {
    /** @var ValueObject[] */
    private $collection = [];

    function addToCollection (array $whatver) {
        if (array_key_exists($whatever, 'smth')) {
            $collection[] = new ValueObject($whatever);
            return true;
        }
        return false;
    }
}

我知道我可以简单地将ValueObject传递给方法,但现实生活addToCollection()有点复杂。

是否可以使用PHPUnit测试此方法,或者我应该在考虑DI的情况下重做它?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用外部注入的工厂构建ValueObject个实例。如果没有注入,则可以在内部创建默认的ValueFactory:

class Subject {

    /** @var ValueObject[] */
    private $collection = [];

    /** @var ValueFactory */
    private $valueFactory;

    public function getValueFactory() {
        if (!isset($this->valueFactory)) {
            $this->valueFactory = new ValueFactory();
        }
        return $this->valueFactory;
    }

    public function setValueFactory(ValueFactory $factory) {
        $this->valueFactory = $factory;
    }

    function addToCollection (array $whatever) {
        if (array_key_exists($whatever, 'smth')) {
            $collection[] = 
                $this->getValueFactory()->buildValueObject($parameters);
            return true;
        }
        return false;
    }
}

现在,在测试中,您可以模拟ValueFactory并将其注入Subject,这样您就可以检查实例的创建方式并控制返回的ValueObject实例。

答案 1 :(得分:1)

在你的情况下,我会说测试这门课很容易。 你有一个成功返回bool的方法。您没有任何getter或setter,因此您需要检查的是方法的返回值。其他所有内容都是实现细节,因此无需对其进行测试。

如果你有依赖关系,你可以通过构造函数来模拟它们,但是从你添加方法的角度来看它没有改变。

另一个建议是考虑单一责任原则。您正在向集合添加内容,但在创建对象之前也要做一些魔术。 将对象的创建移动到另一个类(如工厂)并保持您的类简单 - 只需将对象添加到集合中。 使用这种方法,您将不会拥有依赖项,并且您的代码将很容易测试。