我对PHPUnit有疑问。我想为以下 Message
类编写测试用例,并希望通过传递无效的 default: case
$type
方法中的isValidMessageType()
。只是为了给出一个适当的场景,假设开发人员在isValidMessageType()
方法中添加另一个类型,即3,但忘记在SendMessage()
方法中添加切换案例,在这种情况下默认情况下会抛出异常。
class Message
{
public function isValidMessageType($type)
{
return ($type == 1 || $type == 2)
}
public function SendMessage($type)
{
if(!$this->isValidMessageType($type)){
throw new Exception('Invalid Message type');
}
switch ($type) {
case 1:
// do something
break;
case 2:
// do something
break;
default:
throw new Exception('Invalid Message type');
}
}
}
有人可以帮我解决这个问题吗?
提前致谢
答案 0 :(得分:1)
这里的问题是你复制了用于确定$ type是否正确的逻辑。首先使用 isValidMessageType 方法检查它,但是在默认情况下再次检查它。
你不应该编写你不需要的代码。只需确保如果传递无效的$ type,将抛出异常。你只需要这样做一次。您可以删除 isValidMessageType 方法,系统将按预期工作。
答案 1 :(得分:1)
我发现使用" phpunit --coverage-html outputdir --debug"检查报告(outputdir中的index.html)在这样的时候很有用,看看测试的进展情况。
BTW每个测试应该只测试一件事,否则当测试失败时,你将花费额外的时间来调试测试和代码。考虑修改如下。你可以通过只测试一个好的'来减少重复。价值和一个坏'如果您愿意,除非您特别需要测试更多案例。
public function testOneisValidMessageType()
{
$this->assertTrue($this->TestObject->isValidMessageType(1));
}
public function testTwoisValidMessageType()
{
$this->assertTrue($this->TestObject->isValidMessageType(2));
}
public function testThreeisNotValidMessageType()
{
$this->assertFalse($this->TestObject->isValidMessageType(3));
}
public function testStringisNotValidMessageType()
{
$this->assertFalse($this->TestObject->isValidMessageType('A'));
}
答案 2 :(得分:0)
以下将测试isValidMessageType为TRUE / FALSE的结果,然后测试SendMEssage()的返回值。但是,您需要从SendMessage()返回一些内容或者有可以测试的内容,以真正测试代码。
class Message_TEST extends PHPUnit_Framework_TestCase
{
protected $TestObject;
protected function setUp()
{
$this->TestObject = new Message();
}
protected function tearDown()
{
}
public function testisValidMessageType()
{
$this->assertTrue($this->TestObject->isValidMessageType(1));
$this->assertTrue($this->TestObject->isValidMessageType(2));
$this->assertFalse($this->TestObject->isValidMessageType(3));
$this->assertFalse($this->TestObject->isValidMessageType('A'));
}
/**
* @expectedException \Exception
*/
public function testSendMessageException()
{
$this->TestObject->isValidMessageType(3);
}
public function testSendMessage()
{
$this->assertEquals('Need Return from SendMessage', $this->TestObject->SendMessage(1));
$this->assertEquals('Need Return from SendMessage', $this->TestObject->SendMessage(2));
}
}