PHPUnit - 测试交换机/默认情况


PHPUnit - Testing Switch/Default cases

我有一个关于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));
    }
}