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