31

メソッドsetUp()tearDown()は、各テストの前後に呼び出されます。しかし、実際には、なぜこれが必要なのかについての実際の例はありますか?

他の人のテストを調べると、次のようなものが常に表示されます。

public function setUp()
{
    $this->testsub = new TestSubject();
}

public function tearDown()
{
    unset($this->testsub);
}

public function testSomething()
{
    $this->assertSame('foo', $this->testsub->getFoo());
}

もちろん、この方法と「古い」ローカル変数の方法との間に実質的な違いはありません。

4

4 に答える 4

34

すべてのテスト メソッドを個別に実行すると、テスト コードは、テスト対象のオブジェクトを作成するだけの多くの行を共有します。この共有コードは、setup メソッドに入れることができます (すべきではありません)。

テスト対象のオブジェクトを作成するために行う必要があることはすべて setup メソッドに入ります。たとえば、テスト対象のオブジェクトのコンストラクターに注入されるモック オブジェクトを作成します。

setup の次の呼び出しでクラス メンバー変数が新しいオブジェクト セットで初期化されるため、これを破棄する必要はありません。

分解が必要な唯一のことは、作成されたファイルやデータベース エントリなど、テストが永久に何かを残す場合です。そのようなことを行うテストを書くことは本当に良い考えではありませんが、ある時点で抽象化できなくなり、ハードドライブ、データベース、または実際のネットワークなどに触れなければなりません。

したがって、必要なティアダウンよりも多くのセットアップが必要であり、このテストで行う作業がない場合は、常にティアダウン メソッドを削除します。

モックに関しては、次のように作業します。

private $_mockedService;
private $_object;
protected function setUp()
{
    $this->_mockedService = $this->getMock('My_Service_Class');
    $this->_object = new Tested_Class($this->_mockService);
}

public function testStuff()
{
    $this->_mockedService->expects($this->any())->method('foo')->will($this->returnValue('bar'));
    $this->assertEquals('barbar', $this->_object->getStuffFromServiceAndDouble());
}
于 2012-12-18T23:10:14.107 に答える
4

一連のフィクスチャ オブジェクトをインスタンス化し、テストごとに個別に構築する代わりに、各テストでインスタンス変数として使用できるようにすることができます。

setUp でファイル ハンドルのようなリソースを作成し、tearDown でそれらを閉じるようにします。一時ファイルを書き込んでいる場合は、それらを確実に削除できます。データベース接続を開いた場合は、それを閉じることができます (ただし、別の場所でそれを行いたい場合もあります - setupBeforeClass/tearDownAfterClassすべてのテスト ケースではなく、すべてのテスト ファイルに対して呼び出されます)。

これは、一般的にグルーヴィーなものである前/後のフックです。生活を楽にするために使用するか、使用しないでください。

于 2012-12-18T22:57:45.547 に答える
1

テストしているクラス内に依存関係がある場合は、ほとんどいつでもこれを使用できます。この典型的な例は、アプリケーションの状態を格納する何らかのオブジェクト (セッション オブジェクト、ショッピング カートなど) です。

たとえば、カート オブジェクトで定義されたショッピング カートの中身の送料を計算するクラスがあるとします。そして、このショッピング カートが依存性注入を介して送料計算クラスに渡されるとしましょう。クラスのほとんどのメソッドをテストするには、さまざまなメソッドを単体テストするために、実際にカート オブジェクトをインスタンス化し、それをクラスに設定する必要があります。また、カートにアイテムを追加する必要がある場合もあります。したがって、次のような設定が必要になる場合があります。

public function setUp()
{
    $this->cart = new cart();
    $this->cart->add_item('abc');
    $this->cart->add_item('xyz');
}

また、テスト メソッドが実際にカートのアイテムを変更し、送料情報でそれらを装飾すると仮定しましょう。あるテストから次のテストに情報が流れ込むのは望ましくないため、最後にカートを設定解除するだけです。

public function tearDown()
    unset($this->cart);
}
于 2012-12-18T23:03:30.457 に答える