0

クラスとインターフェースのレベル、つまりLevel1、 、Level2およびがありLevel3ます。
クラスはクラスLevel1に依存しLevel2、クラスはクラスLevel2に依存しLevel3ます。

そのデザインのコードは次のとおりです。

public interface ILevel1
{
    string GetData();
}

public class Level1 : ILevel1
{
    ILevel2 level2;
    public Level1(ILevel2 level2)
    {
        this.level2 = level2;
    }

    public string GetData()
    {
        // some more process on data.
        var data = level2.GetDataAndProc();
        data = data + ",Proc at Level1";
        return data;
    }
}

public interface ILevel2
{
    string GetDataAndProc();        
}

public class Level2 : ILevel2
{    
    ILevel3 level3;
    public Level2(ILevel3 level3)
    {
        this.level3=level3;
    }

    public string GetDataAndProc()
    {
        var data=level3.GetDataFromDB();
        // processing on the data from db.
        data=data+ " Processed at level2";
        return data;
    }
}

public interface ILevel3
{
    string GetDataFromDB();
}

public class Level3 : ILevel3
{
   public string GetDataFromDB()
   {
       // Functionalities to get data from db.
       return "DB Data";
   }
}

これで、分離モック インターフェイスでクラスを単体テストLevel1し、分離モックインターフェイスLevel2でクラスを単体テストできます。私はテスト フレームワークとモック フレームワークとして使用しています。Level2Level3NunitNMock

ここまでは順調ですね。

しかし、最初の 2 つのレベルのコードのみをモックするLevel3インターフェイスをモックせずLevel2に単体テストできますか? つまり、モックLevel1ではなくモックでクラスを単体テストしたいということです。クラスがDBからデータを取得し、このDBレイヤーのみをモックして、プロジェクト全体が実際のdbではなくモックdbだけで動作するようにしたいので、これをやりたかったのです。Level2Level3Level3

4

1 に答える 1

0

それは簡単だ:

// arrange
var mocks = new Mockery();
var mockLevel3 = mocks.NewMock<ILevel3>();
// now do some actual mocking here

var level2 = new Level2(mockLevel3);
var level1 = new Level1(level2);

// now do some act and assert stuff

私の意見では、これは統合テストです。この時点では、すべてのクラスが同じアセンブリにあるかどうかは問題ではありません。統合テストは、必ずしもテストでいくつかのアセンブリをまとめることではありません。

于 2013-09-18T05:37:35.150 に答える