在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()
做了什么,因为默认情况下禁用模拟中的构造函数和克隆?
答案 0 :(得分:0)
他们完全按照他们的意思行事。再看一下你给出的例子。
首先创建一个模拟构建器,然后对其进行自定义以生成所需内容。如果您刚刚调用$this->getMockBuilder()->getMock();
,则会收到不同的测试双倍。
你会收到一个会调用原始构造函数的double,所以你还必须提供构造函数的参数,如下所示:
$this->getMockBuilder()
->setConstructorArgs()
->getMock();
现在看一下createMock()
中的PHPUnit\Framework\TestCase
方法。此方法明确提供了您提到的一些默认值。这就是createMock()
按其工作方式工作的原因。
总结一下:$this->createMock()
和$this->getMockBuilder()->getMock()
不做同样的事情。它们的不同之处在于createMock()
生成带有一些默认值的测试double,而构建器没有这样做。