phpunit 避免了 mock 的构造函数参数

2022-08-30 07:49:50

有什么方法可以避免 phpunit 必须为模拟对象调用构造函数?否则,我需要一个模拟对象作为构造函数参数,另一个用于该参数等。api 似乎是这样的:

getMock($className, $methods = array(), array $arguments = array(),
        $mockClassName = '', $callOriginalConstructor = TRUE,
        $callOriginalClone = TRUE, $callAutoload = TRUE)

我无法让它工作。它仍然抱怨构造函数参数,即使设置为 false。$callOriginalConstructor

我在构造函数中只有一个对象,它是一个依赖注入。所以我不认为我有设计问题。


答案 1

您可以使用以下命令代替:getMockBuildergetMock

$mock = $this->getMockBuilder('class_name')
    ->disableOriginalConstructor()
    ->getMock();

有关详细信息,请参阅 PHPUnit 文档中有关“Test Doubles”的部分。

虽然你可以这样做,但最好不要这样做。您可以重构代码,这样您只需要依靠一个接口,而不是需要注入的具体类(带有构造函数)。这意味着您可以模拟或存根接口,而不必告诉 PHPUnit 修改构造函数行为。


答案 2

给你:

    // Get a Mock Soap Client object to work with.
    $classToMock = 'SoapClient';
    $methodsToMock = array('__getFunctions');
    $mockConstructorParams = array('fake wsdl url', array());
    $mockClassName = 'MyMockSoapClient';
    $callMockConstructor = false;
    $mockSoapClient = $this->getMock($classToMock,
                                     $methodsToMock,
                                     $mockConstructorParams,
                                     $mockClassName,
                                     $callMockConstructor);

推荐