反射Moq对象会产生2个额外的属性

时间:2009-07-20 14:58:51

标签: c# unit-testing moq

我有几种使用反射从一种对象类型转换为另一种对象类型的方法。我正在通过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对象而不检索这些属性?

2 个答案:

答案 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,但它是我能找到的唯一属性来过滤。我认为没有办法过滤反射本身。