2012-03-16 3 views
8

私はDoctrine 2 Mongo ODMユニットテストを書くようになりましたが、これを行うために私のコードには良い戦略がないことが分かりました。テストを実行してオブジェクトを永続化したいのですが、テストデータをtearDownで簡単に削除できるようにしたいと考えています。アノテーションで見たものからコレクション名とDB名を指定しなければならないので、テストDBを作成して後で消去することはできません。ユニットテストドクトリンODM

ベストプラクティスまたはベストプラクティスの例はありますか?

+0

。後でモデル化することはあまりありません。 –

答えて

10

オブジェクトを保持する必要はありません。良い方法は、あなたのオブジェクトが永続化されているかどうかを確認するためにモックを使用することです。私はあなたに例を挙げます。

class SomeSerivce 
{ 
    private $dm; 

    public function __construct(DocumentManager $dm) 
    { 
     $this->dm = $dm; 
    } 

    public function doSomeMagic($someDocument, $someValue) 
    { 
     $someDocument->setSomeValue($someValue); 
     $this->dm->persist($someDocument); 
     $this->dm->flush(); 
    } 
} 

これで、Id Doctrineコードのどこかでテストされたため、ドキュメントが実際に永続化されているかどうかはチェックしません。 persistflushメソッドが正常に動作すると仮定できます。チェックしたいのは、コードがこれらのメソッドを正しく呼び出すかどうかです。

だから、あなたのテストができたが次のようになります。私は教義ODMによって永続化されたモデルをテストする方法のためのベストプラクティスへの任意のポインタが理解されるであろう

(...) 
public function testDoSomeMagic() 
{ 
    $documment = new Document(); 

    // preapre expected object 
    $expectedValue = 123; 
    $expectedDocument = new Document(); 
    $expectedDocument->setValue($expectedValue); 

    // prepare mock 
    $dmMock = $this->getMockBuilder('DocumentManager') 
     ->setMethods(array('persist', 'flush')) 
     ->disableOriginalConstructor() 
     ->getMock(); 
    $dmMock->expects($this->once()) 
     ->method('persist'); 
     ->with($this->equalTo($expectedDocument)); 
    $dmMock->expects($this->once()) 
     ->method('flush'); 

    // new we start testing with the mock 
    $someService = new SomeService($dmMock); 
    $someService->doSomeMagic($document, $expectedValue); 
} 
+1

queryBuildersの追加を開始すると、はるかに複雑になります。提案? –

関連する問題