4

私はちょうどユニットテストを学んでいます。このphpコード

class Foo {
    public function bar($arg) {
        throw new InvalidArgumentException();
    }
}

...

class FooTest extends PHPUnit_Framework_TestCase {
    public function testBar() {
        $this->setExpectedException('InvalidArgumentException');
        $dummy = Foo::bar();
    }
}

Failed asserting that exception of type "PHPUnit_Framework_Error_Warning" matches expected exception "InvalidArgumentException".from phpunitで失敗します。Foo::bar()もちろん、テスト内に値が配置されている場合は、期待どおりに機能します。空の引数をテストする方法はありますか? それとも、単体テストの範囲内にあってはならない何かのテストを誤って作成しようとしていますか?

4

2 に答える 2

6

そのような状況をテストするべきではありません。単体テストの目的は、テスト対象のクラスが、そのパブリックインターフェイス(関数とプロパティ)である「コントラクト」に従って実行されることを確認することです。あなたがやろうとしていることは、契約を破ることです。あなたが言ったように、それはユニットテストの範囲外です。

于 2012-09-18T09:37:54.820 に答える
2

契約のテストで「yegor256」に同意します。ただし、以前に宣言された値を使用するためにオプションの引数がある場合がありますが、それらが設定されていない場合は例外がスローされます。コードのわずかに変更されたバージョン (単純な例、適切でない、または本番環境に対応していない) をテストと共に以下に示します。

class Foo {
    ...
    public function bar($arg = NULL)
    {
        if(is_null($arg)        // Use internal setting, or ...
        {
                  if( ! $this->GetDefault($arg)) // Use Internal argument
                  {
                       throw new InvalidArgumentException();
                  }
        }
        else
        {
            return $arg;
        }
    }
}

...
class FooTest extends PHPUnit_Framework_TestCase {
    /**
     * @expectedException InvalidArgumentException
     */
    public function testBar() {
        $dummy = Foo::bar();
    }

    public function testBarWithArg() {
        $this->assertEquals(1, Foo:bar(1));
    }
}
于 2012-09-18T16:58:38.903 に答える