这是我的界面
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快速入门指南中的一些链接。我知道我错过了什么。你可以通过指导如何进行单元测试来帮助我吗?
答案 0 :(得分:6)
在设置模拟之后,可以这样做
1)创建一个包含导入的CompositionContainer。
2)将Mocks添加到容器中。
container.ComposeExportedValue(mock.Object);
3)创建测试类的实例
4)将mocks组合到导入
container.ComposeParts(instance);
答案 1 :(得分: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);
}
您的测试仅在我的机器上进行了少量修改,您无需使用合成容器进行此测试。