Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHPUnit将模拟对象作为参数传递给另一个对象';s构造函数并使用expects()方法_Php_Unit Testing_Testing_Mocking_Phpunit - Fatal编程技术网

PHPUnit将模拟对象作为参数传递给另一个对象';s构造函数并使用expects()方法

PHPUnit将模拟对象作为参数传递给另一个对象';s构造函数并使用expects()方法,php,unit-testing,testing,mocking,phpunit,Php,Unit Testing,Testing,Mocking,Phpunit,我试图断言,在构建另一个对象的过程中,一个对象(被测试对象)上的方法至少被调用一次。我想使用phpunit的expects()功能来测试是否调用了getDetails()方法。在构造另一个客户帐户对象期间调用此函数。我肯定错过了phpunit工作方式的一些基本内容,但我可能是以python的思维方式来处理这个问题的。我知道我可以在python中实现这一点,但也许在这里不可能? 以下是我的测试代码: public function testPhoneBookCode() { $accoun

我试图断言,在构建另一个对象的过程中,一个对象(被测试对象)上的方法至少被调用一次。我想使用phpunit的expects()功能来测试是否调用了getDetails()方法。在构造另一个客户帐户对象期间调用此函数。我肯定错过了phpunit工作方式的一些基本内容,但我可能是以python的思维方式来处理这个问题的。我知道我可以在python中实现这一点,但也许在这里不可能? 以下是我的测试代码:

public function testPhoneBookCode()
{
    $account = 'testaccount';

    $phone_book_mock = $this->getMockBuilder('\corp\data\PhoneBook')
        ->setConstructorArgs(array(null))
        ->setMethods(null)
        ->getMock();

    $expected = array(
        'id' => 1234,
        'title' => 'Mr',
        'first_name' => 'George',
        'last_name' => 'Smith',
        'phone' => '111-111-1111'
    );

    $phone_book_mock->expects($this->atLeastOnce())
        ->method('getDetails')
        ->with($this->equalTo(1234))
        ->will($this->returnValue($expected));

    try {
        $c = new Customer_Account(
            $account,
            true,
            'acme_corp',
            1234,
            null,
            null,
            $phone_book_mock
        );

    } catch ( \Exception $e ) {
        $this->fail("An unexpected exception has been raised [$account].". $e);
    }
}
此时,我希望Customer_Account类的实例化在我的mock上调用getDetails方法,并且atLeastOnce检查返回true

这段代码是根据一个实际示例修改的。因此,在重新键入时,可能会引入任何打字错误。在实际代码中,“电话簿”被传递到Customer\u Account对象的构造函数中,并在该构造函数中调用getDetails()方法。我已经确认该方法实际上正在被调用,并且得到了预期的返回值。但是,我的mock expects()测试失败

至少调用一次时,方法名称等于的预期失败。 预期调用至少一次,但从未发生


mock没有注册对getDetails()的调用,即使我确信调用了正确的代码。我想做的是不可能的吗?一旦我将模拟对象传递给另一个构造函数,我是否会丢失对它的引用?有没有其他方法可以做到这一点?非常感谢您的帮助。

当您创建
Customer\u帐户的实例时,这可以用来断言
PhoneBook::details()
是通过
$id
调用的:

public function testPhoneBookCode()
{
    $id = 1234;

    $details = [
        'id' => $id,
        'title' => 'Mr',
        'first_name' => 'George',
        'last_name' => 'Smith',
        'phone' => '111-111-1111'
    ];

    $phoneBook = $this->createMock('corp\data\PhoneBook');

    $phoneBook
        ->expects($this->atLeastOnce())
        ->method('getDetails')
        ->with($this->identicalTo($id))
        ->willReturn($details);

    new Customer_Account(
        'testaccount',
        true,
        'acme_corp',
        $id,
        null,
        null,
        $phoneBook
    );
}
有关参考,请参阅:


我认为电话簿对象必须通过引用传递给
Customer\u Account::\uu construct()
才能工作,而不是100%工作。在创建
$phone\u book\u mock时,将
->setMethods(null)
更改为
->setMethods(array('getDetails'))