PHPUnit测试模拟&x27;s方法,该方法将闭包作为参数
我编写了一个类,用yaml文件中的服务填充DI容器。我在测试以下方法时遇到问题:PHPUnit测试模拟&x27;s方法,该方法将闭包作为参数,php,unit-testing,mocking,phpunit,closures,Php,Unit Testing,Mocking,Phpunit,Closures,我编写了一个类,用yaml文件中的服务填充DI容器。我在测试以下方法时遇到问题: private function parseServices(array $services) { foreach ($services as $name => $attr) { $this->container[$name] = function() use($attr) { $reflect = new \ReflectionClass($attr["
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
是模拟的。我想测试对于每个特定参数的服务调用一次容器
。我如何测试这个?我的想法是这样的:
$this->container
->expects($this->at(3))
->method('offsetSet')
->with('demo',$this->callback());
但这不起作用
编辑
这个方法甚至整个类的职责是填充一个容器。所以也许测试它的最好方法就是检查容器是否正确填充?正如我在一篇评论中所写的——不要嘲笑容器,而是使用一个具体的实现。你觉得怎么样?好吧,也许这不是你问题的确切答案,但无论如何都会有帮助 我会设计不同的测试。由于您想测试是否正在构建适当的服务,所以使用一些访问器来获取第三个服务并检查它是否是适当类的对象会更容易 。。。我刚才看到编辑;)-确切地有了正确设计的代码,从“外部”的角度测试类就更容易了。我们只需要在遗留系统上,即不能注入依赖项时,才需要这种恶意的模拟 //原始答案 你能解释一下什么是抵销集吗 从你的测试中我看到的是你试图断言
$this->container
“演示”
字符串和$this->callback()
返回什么(可能您的意思是回调this->callback
应该作为第二个参数传递,而不是调用它的结果?)或者,最简单的解决方案可能是在测试中使用真实的容器对象,其中测试了
parseServices()
,然后我可以检查容器对象的状态。我的意思是,我可以检查集装箱是否会退回我想要的服务。容器类已经过全面测试。顺便说一句,这是Pimple->-也许会有帮助。这是ArrayAccess接口->中的一种方法,请查看我上面的评论。是的,你是对的。方法偏移集是第三次调用,参数为:“demo”和closure/callback我编辑了我的答案:)你的想法与不同的测试方法更接近我的心。这正是我首先要尝试的。