disableOriginalConstructor有什么作用?

时间:2018-04-22 09:37:27

标签: php phpunit

在phpunit文档中是示例:

db.getCollection('mycollection').aggregate([
  {$group: {
   "_id": { 
       "location": { 
        "A": { "$sum": { "$cond": [{ "$in": [ "A", "$locations" ] },1,0] } },
        "B": { "$sum": { "$cond": [{ "$in": [ "B", "$locations" ] },1,0] } },     
        "1": { "$sum": { "$cond": [{ "$in": [ "1", "$locations" ] },1,0] } },
       }
    }    
  }}
])

$stub = $this->getMockBuilder($originalClassName) ->disableOriginalConstructor() ->disableOriginalClone() ->disableArgumentCloning() ->disallowMockingUnknownTypes() ->getMock(); disableOriginalConstructor()做了什么,因为默认情况下禁用模拟中的构造函数和克隆?

1 个答案:

答案 0 :(得分:0)

他们完全按照他们的意思行事。再看一下你给出的例子。 首先创建一个模拟构建器,然后对其进行自定义以生成所需内容。如果您刚刚调用$this->getMockBuilder()->getMock();,则会收到不同的测试双倍。 你会收到一个会调用原始构造函数的double,所以你还必须提供构造函数的参数,如下所示:

$this->getMockBuilder()
    ->setConstructorArgs()
    ->getMock();

现在看一下createMock()中的PHPUnit\Framework\TestCase方法。此方法明确提供了您提到的一些默认值。这就是createMock()按其工作方式工作的原因。

总结一下:$this->createMock()$this->getMockBuilder()->getMock()不做同样的事情。它们的不同之处在于createMock()生成带有一些默认值的测试double,而构建器没有这样做。