1

MSTestでMoqを使用する方法を学んでいます。既存のアプリケーションで、テストしたい次の方法があります。

/// <summary>
/// Return the marker equipment Id value give a coater equipment Id value.
/// </summary>
/// <param name="coaterEquipmentId">The target coater</param>
/// <returns>The marker equipment Id value</returns>
internal static string GetMarkerEquipmentId(string coaterEquipmentId)
{
    return CicApplication.CoaterInformationCache
        .Where(row => row.CoaterEquipmentId == coaterEquipmentId)
        .Select(row => row.MarkerEquipmentId)
        .First();
}

CicApplicationオブジェクトは、 CoaterInformationクラスのリストであるCoaterInformationCacheという名前のプロパティを持つ「グローバル」オブジェクトです。

どういうわけかCicApplication.CoaterInformationCacheをモックする必要があると思います。おそらく、実行時に値のみを含むグローバルオブジェクトを介してリストにアクセスするのではなく、CoaterInformationクラスのリストを含むインターフェイスをこのメソッドに渡す必要がありますか?

どうもありがとう

4

1 に答える 1

2

グローバル/静的は、単体テスト容易性の悩みの種です。CicApplicationこれをテスト可能にするには、グローバルを排除する必要があるという点で正しいです。ICicApplication同じパブリック API を使用してインターフェイスを作成し、インスタンスをアプリケーション コードに渡すことができます。

public interface ICicApplication
{
    public List<CoaterInformation> CoaterInformationCache { get; }
}

public DefaultCicApplication : ICicApplication
{
    public List<CoaterInformation> CoaterInformationCache
    {
        // Either use this class as an adapter for the static API, or move
        // the logic here.
        get { return CicApplication.CoaterInformationCache; }
    }
}

これは静的メソッドであるため、メソッド引数として渡すことができます。それ以外の場合は、静的メソッドをインスタンス メソッドに変換ICicApplicationし、オブジェクトのフィールドを初期化します (おそらくインスタンスをコンストラクターに渡します)。

次に、単体テストをセットアップするときに、Moq でセットアップされたモック インスタンスを渡すことができます。

Mock<ICicApplication> appMock = new Mock<ICicApplication>();
appMock
    .SetupGet(ca => ca.CoaterInformationCache)
    .Returns(new List<CoaterInformation> { ... });
于 2012-12-20T16:00:05.690 に答える