【发布时间】:2015-08-23 05:53:19
【问题描述】:
我正在用 symfony2 做一些 PHPUnit 测试。我对一项特定的测试有疑问。
我正在测试我的班级之一的回答,当然一个回答是对的,一个是假的。我有一个我的数据库的模拟,并且我有一个用于我的 databaseRepository 中的一种方法的存根。
问题在于,在一个测试中,我对具有有效数组的方法进行了存根,第二个测试我只想查询为无效 null。
我的数据库模拟:
//Setting up mock of database repository class
$this->db = $this->getMockBuilder('DatabaseRepository')
->disableOriginalConstructor()
->getMock();
$this->db->expects($this->any())
->method('getRecord')
->will($this->returnValue(self::$registrationRecord));
$this->db->expects($this->any())
->method('getRecord')
->willReturn(null);
所以我试图有两个不同的期望,但这显然不起作用.....是否有可能有一个存根方法有两个不同的返回......?
测试1:
<?php
class UnsubscribeRegistrationTemplateTest extends \PHPUnit_Framework_TestCase
{
/**
* @var UnsubscribeRegistrationTemplate
*/
protected $object;
/**
* @var ValidationClass
*/
public $validate;
/**
* @var DatabaseRepository
*/
public $db;
//Database Record Mock
public static $registrationRecord = array
(
'rowid' => '96',
'unsubscription' => 'N',
'updated' => 'BB'
);
/**
*
*/
protected function setUp()
{
//Setting up mock of validation class
$this->validate = $this->getMockBuilder('ValidationClass')
->disableOriginalConstructor()
->getMock();
$this->validate->expects($this->any())
->method('validateInput')
->willReturn(true);
//Setting up mock of database repository class
$this->db = $this->getMockBuilder('DatabaseRepository')
->disableOriginalConstructor()
->getMock();
$this->db->expects($this->any())
->method('getRegistrationRecord')
->will($this->returnValue(self::$registrationRecord));
$this->db->expects($this->any())
->method('getRegistrationRecord')
->will($this->returnValue(null));
$this->db->expects($this->any())
->method('setPreRegistrationEnquiryUnsubscriptionEnabled')
->willReturn(true);
$this->object = $this->createUnsubscribeRegistrationTemplateInstance();
}
/**
* @return UnsubscribeRegistrationTemplate
*
*/
public function createUnsubscribeRegistrationTemplateInstance()
{
//initialize Unsubscribe Registration Template
return new UnsubscribeRegistrationTemplate
(
$this->validate,
$this->db
);
}
/**
* @param array $mapping
* @return Request
*/
public function createRequest(array $mapping)
{
$request = new Request();
foreach ( $mapping as $k =>$v)
{
$request->query->set($k, $v);
}
return $request;
}
/**
*
*/
public function testUnsubscribeRegistrationTemplateValidResponse()
{
$request = $this->createRequest(array(
'registration_id' => '96',
'source_channel' => 'BB'
));
$response = new Response(
true,
'Unsubscription successful'
);
$this->assertEquals($response, $this->object->create($request));
}
/**
*
*/
public function testUnsubscribeRegistrationTemplateEmptyResponse()
{
$request = $this->createRequest(array(
'registration_id' => '96',
'source_channel' => 'BB'
));
$response = new Response(
false,
'Registration Record Not Found.'
);
$this->assertEquals($response, $this->object->create($request));
}
/**
*
*/
public function testIsAlreadyRegisteredValidResponse()
{
//Testing record is already unsubscribed
$registrationRecord = array(
'unsubscription_enabled' => 'Y'
);
$this->assertTrue($this->object->isAlreadyUnsubscribed($registrationRecord));
}
/**
*
*/
public function testIsAlreadyRegisteredInValidResponse()
{
//Testing record not unsubscribed
$registrationRecord = array(
'unsubscription_enabled' => 'N'
);
$this->assertFalse($this->object->isAlreadyUnsubscribed($registrationRecord));
}
/**
*
*/
protected function tearDown()
{
unset($this->object);
}
}
【问题讨论】:
-
在相关测试方法中移动expect,例如,如果
testIsAlreadyRegisteredInValidResponse希望getRecord返回null,将代码移到那里并从设置中删除另一个expect。 -
是的,我以前这样做过,但是我的 PhpStorm 突出显示了 expect 函数,虽然它不起作用,所以甚至从来没有尝试过:/ 现在我做到了,它工作得很好,但是 phpstorm hihglights它说:在类 databaseRepository 中找不到方法期望
-
别担心,这只是因为 phpstorm 不理解正确的对象类型,可能是由于错误或丢失了 PHPDoc 注释。所以你解决了?
-
是的,我确实投了赞成票,但平心而论,@Pierre Marichez 一开始就提到了这种形式
-
当然,皮埃尔马上明白你有什么问题。重要的是您解决了问题并...您了解如何更好地使用测试框架!
标签: php unit-testing symfony phpunit