Como usar o Moq para satisfazer uma dependência de importação do MEF para testes de unidade?

Esta é minha interface

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

e minha aula

<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 : Eu quero testar o método de unidadeGetIdentifierForItem

Aqui está o que eu tentei fazer para resolvê-lo -

(1) Crie um mock Lazy e defina os valores que ele precisa para retornar na propriedade

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

(2) Crie uma lista de tipos de janela e o objeto de zombaria acima e, em seguida, defina-o para o objeto criado A

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

(3) Crie a informação simulada

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

Para juntar todos os itens acima como teste de unidade

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

Este teste de unidade não consegue executar e lança uma exceção 'TargetInvocationException' e veiwing os detalhes, parece que estou fazendo algo que eu não deveria estar fazendo.

Mas eu não sei como fazer de outra maneira. Eu li alguns dos links no guia Quickstart do Moq. Eu sei que estou perdendo alguma coisa. Você pode me ajudar, orientando como unidade de teste isso?

questionAnswers(2)

yourAnswerToTheQuestion