【发布时间】:2014-07-06 00:04:44
【问题描述】:
我编写了一个类,它使用来自 yaml 文件的服务填充 DI 容器。我在测试以下方法时遇到问题:
private function parseServices(array $services)
{
foreach ($services as $name => $attr) {
$this->container[$name] = function() use($attr) {
$reflect = new \ReflectionClass($attr["class"]);
$args = $this->parseArguments($attr["arguments"]);
return $reflect->newInstanceArgs($args);
};
}
}
$services 是一个包含服务的数组:
array(
serviceName => array(
class => className,
arguments => array(...)
)
)
方法parseArguments() 为构造函数返回一个简单的参数数组。对于测试$container 是一个模拟。我想测试container 是否为每个服务女巫特定参数调用一次。我该如何测试呢?我的想法是这样的:
$this->container
->expects($this->at(3))
->method('offsetSet')
->with('demo',$this->callback());
但这不起作用。
编辑
这个方法甚至整个类的职责是填充一个容器。所以也许测试它的最好方法是检查容器是否正确填充?正如我在评论中所写 - 只是不要模拟容器,而是使用具体的实现。你怎么看?
【问题讨论】:
-
或者最简单的解决方案可能是在测试中使用真正的容器对象
parseServices()进行测试,然后我可以检查容器对象的状态。我的意思是我可以检查容器是否会返回我想要的服务。容器类经过全面测试。顺便说一句,这是疙瘩 -> pimple.sensiolabs.org - 也许会有所帮助。
标签: php unit-testing mocking phpunit closures