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

2 番目のスクリーンショット (エラーのあるもの) には

「@expectedException例外」

3番目は持っていますが

@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

同じ問題に遭遇しました。expectedException何らかの理由で、PHPUnitでは一般的な例外を設定できません。その理由はわかりません。個人的には、例外を区別するたびに新しい例外クラスを作成するよりも、カスタム例外コードをスローすることを選択しています。

これが私がそれを回避した方法です:

/**
 * @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 クラスをテストするだけで、それがジェネリックである場合は、別の例外として再ラップします。Test_Exception.

- アップデート -

昨日、現在の「マスター」ブランチで一般的な例外制限が削除されたことがわかりました。これは 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 に答える