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