PHPUnit testing Mock's方法,它将closure作为参数


PHPUnit testing Mock's method which takes closure as a param

我编写了一个类,用来自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());

但是这行不通。

<标题>编辑

这个方法甚至整个类的职责是填充容器。所以最好的测试方法就是检查容器是否被正确填充?正如我在评论中所写的那样,不要模仿容器,而是使用具体的实现。你觉得怎么样?

好吧,也许这不是你的问题的答案,但无论如何都可能有所帮助。

我会设计不同的测试。由于您想要测试是否正在构建正确的服务,因此使用一些访问器来获取第三个服务并检查它是否是正确类的对象会更容易。

…我刚刚看到了编辑;)-没错!有了适当设计的代码,从"外部"的角度测试类就更容易了。只有在遗留系统上,当i.e.不能注入依赖时,才需要这样的恶意嘲弄。

//原始答案你能解释一下什么是抵消吗?

从我在你的测试中看到的是你试图断言

  1. 方法offsetSet$this->container上被调用时
  2. 第三次
  3. 应该带两个参数调用:
    1. 'demo' string and
    2. 无论$this->callback()返回(也许你的意思是回调this->callback应该作为第二个参数传递,而不是调用它的结果?)