Jak użyć Moq do spełnienia zależności importowej MEF dla testów jednostkowych?

To jest mój interfejs

<code>public interface IWork
{
    string GetIdentifierForItem(Information information);
}
</code>

i moja klasa

<code>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;
}
}
</code>

Problem : Chcę przetestować metodęGetIdentifierForItem

Oto, co próbowałem zrobić, aby go rozwiązać -

(1) Utwórz makietę Lazy i ustaw wartości, których potrzebuje, aby zwrócić właściwość

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

(2) Utwórz listę typów okien i powyższy wyszydzony obiekt, a następnie ustaw go na utworzony obiekt A.

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

(3) Utwórz próbną informację

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

Aby umieścić wszystkie powyższe razem jako test jednostkowy

<code>[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);

}
</code>

Ten test jednostkowy nie wykonuje i zgłasza wyjątek „TargetInvocationException” i wyświetla szczegóły, wygląda na to, że robię coś, czego nie powinienem robić.

Ale nie jestem pewien, jak to zrobić inaczej. Przeczytałem kilka linków w przewodniku Szybki start Moq. Wiem, że czegoś brakuje. Czy możesz mi pomóc, kierując tym, jak to przetestować?

questionAnswers(2)

yourAnswerToTheQuestion