2012-04-19 16 views
4

これは私のインターフェイス単体テストのMEFインポート依存関係を満たすためにMoqを使用するにはどうすればよいですか?

public interface IWork 
{ 
    string GetIdentifierForItem(Information information); 
} 

と私のクラス

public class A : IWork 
{ 
[ImportMany] 
public IEnumerable<Lazy<IWindowType, IWindowTypeInfo>> WindowTypes { get; set; } 

public string GetIdentifierForItem(Information information) 
{ 
    string identifier = null; 
    string name = information.TargetName; 

    // Iterating through the Windowtypes 
    // searching the 'Name' and then return its ID 
    foreach (var windowType in WindowTypes) 
    { 
     if (name == windowType.Metadata.Name) 
     { 
      identifier = windowType.Metadata.UniqueID; 
      break; 
     } 
    } 
    return identifier; 
} 
} 

問題です:私はここに方法GetIdentifierForItem

が、私はそれを解決するためにやってみました何でユニットテストしたい -

(1)モックレイジーを作成し、小道具に戻す必要がある値を設定しますerty取得

var windowMock = new Mock<Lazy<IWindowType, IWindowTypeInfo>>(); windowMock.Setup(foo => foo.Metadata.Name).Returns("Data"); windowMock.Setup(foo => foo.Metadata.UniqueID).Returns("someString");

(2)

var WindowTypesList = new List<IWindowType, IWindowTypeInfo>>(); 
WindowTypesList.Add(windowMock.Object); 
A a = new A(); 
a.WindowTypes = WindowTypesList; 

(3)模擬情報を作成し、ウィンドウタイプリストと上記モックオブジェクトを作成し、作成したオブジェクトに設定

var InfoMock = new Mock<Information>(); 
InfoMock.Setup(foo => foo.TargetName).Returns("Data"); 

単位テストとして上記のすべてをまとめるには

[TestMethod] 
public void GetIDTest() 
{ 
    var windowMock = new Mock<Lazy<IWindowType, IWindowTypeInfo>>(); 
    windowMock.Setup(foo => foo.Metadata.Name).Returns("Data"); 
    windowMock.Setup(foo => foo.Metadata.UniqueID).Returns("someString"); 

    var WindowTypesList = new List<Lazy<IWindowType, IWindowTypeInfo>>(); 
    WindowTypesList.Add(windowMock.Object); 

    A a = new A(); 
    a.WindowTypes = WindowTypesList; 
    var InfoMock = new Mock<Information>(); 
    InfoMock.Setup(foo => foo.TargetName).Returns("Data"); 

    string expected = "someString"; // TODO: Initialize to an appropriate value 
    string actual; 
    actual = a.GetIdentifierForItem(InfoMock.Object); 
    Assert.AreEqual(expected, actual); 

} 

このユニットテストは実行に失敗し、例外 'TargetInvocationException'がスローされ、詳細を監視すると、実行してはいけないことがあるように見えます。

しかし、どうやって他の方法で行うのか分かりません。 Moqのクイックスタートガイドにあるリンクの一部を読んでいます。私は何かが足りないことを知っている。これを単体テストする方法を教えて助けてくれますか?

答えて

2

にモックを作曲)テストしたクラスのインスタンス

4を作成します。それはあなたのテストで動作するのに十分柔軟です。その代わり、IWindowTypeInfo

[TestMethod] 
public void GetIDTest() 
{ 
    var windowTypeInfoMock = new Mock<IWindowTypeInfo>(); 
    windowTypeInfoMock.Setup(foo => foo.Name).Returns("Data"); 
    windowTypeInfoMock.Setup(foo => foo.UniqueID).Returns("someString"); 
    var lazyWindow = 
     new Lazy<IWindowType, IWindowTypeInfo>(windowTypeInfoMock.Object); 

    var WindowTypesList = new List<Lazy<IWindowType, IWindowTypeInfo>>(); 
    WindowTypesList.Add(lazyWindow); 

    var a = new A(); 
    a.WindowTypes = WindowTypesList; 
    var InfoMock = new Mock<Information>(); 
    InfoMock.Setup(foo => foo.TargetName).Returns("Data"); 

    string expected = "someString"; 
    string actual; 
    actual = a.GetIdentifierForItem(InfoMock.Object); 
    Assert.AreEqual(expected, actual); 
} 

あなたのテストでは、わずかな修正を加えて私のマシンに渡し、あなたがこのテストのために組成物容器を使用する必要はありませんモック。

6

これは、それがCompositionContainerを作成する)モック

1を設定した後、行うことができる方法である輸入を保持します。

2)容器にモックを追加する。

container.ComposeExportedValue(mock.Object); 

3)輸入あなたがLazy<T,TMetadta>をモックする必要はありません

container.ComposeParts(instance); 
関連する問題