1

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

4

2 回答 2

1

今天下午我在想这个,所以这里有另一个想法。

如果我在自己的项目中对此进行编码,我会抽象出对象的反射。我将创建一个接口,该接口为将返回对象属性的类定义一个协定,然后创建一个通过使用反射返回一组属性来实现该接口的类。和你可能正在做的一样。

但是在测试中,我会创建一个新的接口实现,但我会添加任何我需要的规则来过滤掉我的模拟对象上不需要的属性。我的实时代码不包含任何测试所需的代码。

我只是想把这个想法拿出来,只是想帮忙。祝你好运!

于 2009-07-20T19:15:03.330 回答
0

我查看了 LinqPad 中的代码,我能找到删除这两个属性的唯一解决方案是根据 PropertyType 或 Name 是否包含“Mock”来排除它们。例如:

pInfo.Where(item => item.PropertyType.ToString().Contains("Mock") == false);
pInfo.Where(item => item.Name.Contains("Mock") == false);

这是边缘hacky,但它是我能找到过滤的唯一属性。我认为没有办法过滤反射本身。

于 2009-07-20T17:49:08.137 回答