¿Cómo usar Moq para satisfacer una dependencia de importación de MEF para pruebas de unidad?

Esta es mi interfaz

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

y mi clase

<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>

Problema : Quiero hacer una prueba unitaria del método.GetIdentifierForItem

Esto es lo que intenté hacer para resolverlo.

(1) Cree un Lazy simulado y establezca los valores que necesita para devolver en la propiedad se obtiene

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

(2) Cree una lista de tipo de ventana y el objeto simulado anterior y luego configúrelo en el objeto A creado

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

(3) Crea el simulacro de información.

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

Poner todos los anteriores juntos como la prueba de unidad.

<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>

Esta prueba de unidad no se ejecuta y lanza una excepción 'TargetInvocationException' y al ver el detalle, parece que estoy haciendo algo que no debería estar haciendo.

Pero no estoy seguro de cómo hacerlo de otra manera. He leído algunos de los enlaces en la guía de inicio rápido de Moq. Sé que me estoy perdiendo algo. ¿Puedes ayudarme guiando cómo hacer una prueba de unidad?

Respuestas a la pregunta(2)

Su respuesta a la pregunta