4

次のクラスがあるとします。

class Foo
{
    static function bar($inputs)
    {
         return $something;
    }
}

さて、テストクラスには次の構造があります。

class FooTest extends PHPUnit_Framework_TestCase
{
    function testBar()
    {
         $result = Foo::bar($sample_data_1);
         $this->assertSomething($result);

         $result = Foo::bar($sample_data_2);
         $this->assertSomething($result);

         $result = Foo::bar($sample_data_3);
         $this->assertSomething($result);
    }
}

これは良い構造ですか?testBar()3つの別々の機能に分割する必要がありますか? なんで?なぜだめですか?

4

1 に答える 1

6

異なるデータセットで同じコードを使用していて、同様の出力が期待される場合は、dataProvider()機能を使用できます

PHPUnit ドキュメントからの例:

<?php
class DataTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider provider
     */
    public function testAdd($sample, $data, $result)
    {
        $this->assertEquals($result, Foo::bar($sample, $data);
    }
 
    public function provider()
    {
        return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
        );
    }
}

たとえば、入力に応じて XML と JSON を返すなど、戻り値/構造がまったく異なる場合は、適切なassert[Xml/Json]StringMatches()関数を使用してより適切なエラー出力を得ることができるため、複数のテストを実行することをお勧めします。

追加のエラー チェックについては、さらにテスト メソッドを追加することをお勧めします。

/**
 * @expectedException InvalidArgumentException
 */
public function testError() {
    Foo::bar("invalidArgument");
}
于 2012-09-19T13:23:43.593 に答える