PHPUnit - 测试开关/默认情况

时间:2013-12-04 10:58:58

标签: php phpunit

我对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');
        }

    }

}

有人可以帮我解决这个问题吗?

提前致谢

3 个答案:

答案 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));
    }
}