我有几种使用反射从一种对象类型转换为另一种对象类型的方法。我正在通过Moq测试转换方法,并偶然发现了一个我不知道如何处理的行为。当我反映Moq对象以获取PropertyInfo时,我得到另外两个对象。
Moq.Mock``1[Namespace.Class+IElement] Mock
Moq.Mock Mock
重现这一点的代码如下:
public void Moq_Reflection() {
var realElement = new Stuff();
// Produces 2 items
PropertyInfo[] pInfo = realElement.GetType().GetProperties();
var mockElement = new Mock<IElement>();
mockElement.Setup(e => e.Property1).Returns(12);
mockElement.Setup(e => e.Property2).Returns(42);
// Produces 4 items
pInfo = mockElement.Object.GetType().GetProperties();
}
public interface IElement {
int Property1 { get; set; }
int Property2 { get; set; }
}
public class Stuff : IElement
{
public int Property1
{
get { return -1; }
set { }
}
public int Property2
{
get { return -2; }
set { }
}
}
有没有办法反映Moq对象而不检索这些属性?
答案 0 :(得分:1)
我今天下午想的更多,所以这是另一个想法。
如果我在自己的项目中对此进行编码,我会抽象出对象的反射。我创建了一个接口,它定义了一个类的契约,它将返回一个对象的属性,然后通过使用反射来创建一个实现该接口的类来返回一组属性。和你正在做的一样。
但是在测试中,我会创建一个新的接口实现,但是我会添加我需要的任何规则来过滤掉模拟对象上不需要的属性。我的实时代码不包含测试所需的任何代码。
我只是想把这个想法拿出来,只是想帮忙。祝你好运!
答案 1 :(得分:0)
我看了一下LinqPad中的代码,我能找到的解决这两个属性的唯一解决方案是根据PropertyType或Name是否包含“Mock”来排除它们。例如:
pInfo.Where(item => item.PropertyType.ToString().Contains("Mock") == false);
pInfo.Where(item => item.Name.Contains("Mock") == false);
这是边缘hacky,但它是我能找到的唯一属性来过滤。我认为没有办法过滤反射本身。