4

これは私のインターフェースです

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) モック Lazy を作成し、プロパティの取得時に返す必要がある値を設定します

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

(2)ウィンドウタイプリストと上記のモックオブジェクトを作成し、作成したAオブジェクトに設定する

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 のクイックスタート ガイドのリンクをいくつか読みました。私は何かが欠けていることを知っています。これを単体テストする方法を教えてください。

4

2 に答える 2

6

モックを設定した後、これがどのように行われるか

1)インポートを保持するCompositionContainerを作成します。

2) コンテナーにモックを追加します。

container.ComposeExportedValue(mock.Object);

3) テスト済みクラスのインスタンスを作成する

4) モックを作成してインポートする

container.ComposeParts(instance);
于 2012-04-19T07:17:54.883 に答える
2

をモックする必要はありませんLazy<T,TMetadta>。それはあなたのテストで働くのに十分な柔軟性があります。代わりに、モック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);
}

テストはわずかな変更を加えるだけで私のマシンに合格します。このテストにコンポジションコンテナを使用する必要はありません。

于 2012-04-19T11:42:49.983 に答える