3

我的 CalTest 类中的 Cal 类中有 div() 有以下方法来测试 div()。

public fucnction div($a,$b){
   if($b == 0){
    throw new Exception("Divided by zero");
   }
   return $a/$b
}

我只能通过 testDiv() 但 testDiv2()。

在此处输入图像描述

我想检查一下使用 PHPUnit 正确抛出的异常。我在这里想念什么?非常感谢您的帮助。谢谢!

在此处输入图像描述

4

6 回答 6

4

您的第二张截图(有错误的截图)有

“@expectedException 异常”

而第三个有

@expectedException InvalidArgumentException

你真的仍然得到错误吗?你保存文件了吗?


为我工作:

Foo.php

<?php

class Foo
{
    static function t()
    {
        throw new InvalidArgumentException('Hi there');
    }
}

?>

FooTest.php

<?php
require_once 'Foo.php';
class FooTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException InvalidArgumentException
     */
    public function testT()
    {
        Foo::t();
    }
}

?>

结果

$ phpunit .
PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)
于 2012-05-04T12:21:45.233 回答
3

刚刚遇到同样的问题。出于某种原因,PHPUnit 不允许您将 设置expectedException为通用异常,我不知道为什么。就我个人而言,我选择抛出自定义异常代码,而不是每次我想区分异常时都必须创建一个新的异常类。

这是我解决它的方法:

/**
 * @expectedException Test_Exception
 */
public function testDivByZero()
{
    try {
        // Fyi you don't need to do an assert test here, as we are only testing the exception, so just make the call
        $result = $this->object->div(1,0);
    } catch (Exception $e) {
        if ('Exception' === get_class($e)) {
            throw new Test_Exception($e->getMessage(), $e->getCode());
        }
    }
 }

 // Test_Exception.php
 class Test_Exception extends Exception
 {
     public function __construct($message = null, $code = 0, Exception $previous = null)
     {
         parent::__construct($message, $code, $previous);
     }
 }

这将允许您以您想要的方式设计您的代码,并抛出“通用”异常。基本上它只是测试 Exception 类,如果它是通用的,则将其重新包装为不同的异常;测试异常。

- 更新 -

昨天发现他们已经删除了当前“master”分支中的通用异常限制,这将是 3.7。显然,首席工程师不想修补 3.6。

于 2012-05-24T20:31:05.313 回答
2

它在 PHPUnit 抛出的异常中是这样说的:

您不能排除通用异常类。

让您的类抛出更详细的 Exceptions,并进一步指定您在单元测试中期望的异常类型。

于 2012-05-04T11:38:22.237 回答
2

此问题已在PHPUnit 3.7.x

您可以在 PHPUnit 3.7.x 中使用以下通用异常

    /**
     * @expectedException Exception     
     */
于 2013-08-30T17:00:10.460 回答
0

你可以做这样的事情

编写单元测试,以便注入触发异常所需的值

//断言 $this->assertTrue($this->setExpectedException('PHPUnit_Framework_ExpectationFailedException'));

于 2012-05-06T18:16:01.390 回答
0

我创建了一个父类方法来做到这一点。事实上,这个类来自 laravel,但在任何情况下都是有效的。

这个方法最酷的部分是在 PHP 中使用匿名函数

<?php
class TestCase 
         /* if you are not using laravel, you dont need this 
        extends Illuminate\Foundation\Testing\TestCase */ {

    protected function assertThrows( $function , $classException = "/Exception" )
    {
        try 
        {
            // Anonymous functions FTW
            $function();
        }
        catch( /Exception $objException )
        {
            // the assertInstanceOf should solve from here but
            // it is not working that great
            // @see http://stackoverflow.com/questions/16833923/phpunit-assertinstanceof-not-working
            if( $objException instanceof $classException ) {
                return $this->assertTrue( true );
            } else {
                // this will throw a error with a cool message
                return $this->assertEquals( $classException  , get_class( $objException ));
            }
        }
        // no exception happened.
        return $this->fail( "Exception " . $classException . " expected." );
    }

}

class LanguageTest extends TestCase {

    /**
     * Test the translation
     *
     * @return void
     */
    public function testTranslation()
    {
        // this test may be ok
        $this->assertThrows( 
            function(){ throw new Full\Path\Exception(":("); }, 
            "Full\Path\Exception" );

        // this test may fail 
        $this->assertThrows( 
            function(){ return 1 + 1; }, 
            "Some\Excepted\Exception" );

        // this test may work 
        $this->assertThrows( 
            function(){ throw new Exception( "sad" ); }
        );
    }

} 
于 2014-04-10T16:08:39.727 回答