我有一个关于PHPUnit的问题。我想为以下Message
类编写一个测试用例,并希望通过在 isValidMessageType()
方法中传递无效$type
来涵盖测试用例中的default: case
。只是为了给你一个适当的场景,什么时候会有用,假设开发人员在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');
}
}
}
有人可以帮我如何实现这一目标吗?
提前致谢
这里的问题是你重复了用于确定$type是否正确的逻辑。首先使用 isValidMessageType 方法检查它,然后在默认情况下再次检查它。
你不应该编写不需要的代码。只要确保如果你传递了一个无效的$type就会抛出一个异常。您只需要执行此操作一次。您可以摆脱isValidMessageType方法,系统将按预期工作。
我发现使用"phpunit --coverage-html outputdir --debug"并检查报告(index.html in outputdir(在这样的时候很有用,看看测试的进展。
顺便说一句,每个测试应该只测试一件事,否则当测试失败时,您将花费额外的时间来调试测试和代码。考虑修改如下。如果您愿意,您可以通过只测试一个"好"值和一个"坏"值来减少重复,除非您特别需要测试更多情况。
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'));
}
下面将测试来自 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));
}
}