0

以下のコードがあると想像してください

public class test
  {
   public void Condition(x,y)
   {
       if (x == y)
       {
           methodOne();
       }
       else
       {
           methodTwo();
       }
   }
    public void methodOne(){//do some database stuff}
    public void methodTwo(){//do some database stuff}
 }

x==y の場合に methodone が呼び出されるかどうかをアサートしたいが、テストでメソッド 1 内のコードを実行したくない場合は、データベース関連の処理を行うため...

私はこのようなことを書いています

 MockRepository mockRepository=new MockRepository();
 var Mock = mockRepository.PartialMock<test>();
 mock.Replay();
 mock.condition(1,1);
 mock.AssertWasCalled(x=>x.methodOne);
 mock.VerifyAllExpectations();

しかし、メソッド1でも実行しようとしますが、テストでデータベース接続を実行したくありません。条件が機能しており、呼び出されたかどうかを確認するだけです。

4

1 に答える 1

2

懸念事項、ビジネス ロジック、およびデータ アクセスを 1 つのクラスに混在させています。単一責任の原則関心の分離について考える必要があります。

あなたpublic void Condition(x,y)はおそらくビジネスロジック層にいmethodOne()methodTwo()データアクセス層にいるはずです。

データ アクセス レイヤーは、ビジネス ロジック レイヤーに注入 ( IoC ) して、モック アウトできるようにする必要があります。そうすれば、Condition メソッドをテストするときに、実際にはデータベースに接続しないモック データ アクセス レイヤーを渡すことができます。

そうすれば、データベースへの書き込みなどの副作用なしで、現在のように Condition が呼び出されたことを確認できます。このような状況に遭遇した場合、コードをより良いアーキテクチャに分割するのに役立ち、最終的にはテスト駆動開発の調査につながる可能性があります。

于 2013-02-05T10:04:51.670 に答える