Отражение на объекте Moq дает 2 дополнительных свойства - PullRequest
1 голос
/ 20 июля 2009

У меня есть пара методов, которые используют отражение для преобразования из одного типа объекта в другой. Я нахожусь в процессе тестирования методов преобразования через 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 ]

1 голос
/ 20 июля 2009

Сегодня я больше думал об этом, так что вот еще одна идея.

Если бы я кодировал это в своем собственном проекте, я бы абстрагировал отражение объекта. Я бы создал интерфейс, который определяет контракт для класса, который будет возвращать свойства объекта, а затем создал бы класс, который реализует этот интерфейс, используя отражение для возврата набора свойств. То же самое, что вы, вероятно, делаете.

Но тогда в тестах я бы создал новую реализацию интерфейса, но я бы добавил в нее все необходимые правила, чтобы отфильтровать нежелательные свойства в моих фиктивных объектах. Мой живой код не будет содержать код, необходимый для тестирования.

Мне просто нужно было донести эту идею, просто пытаясь помочь. Удачи!

0 голосов
/ 20 июля 2009

Я взглянул на код в LinqPad, и единственное решение, которое я смог найти, чтобы вырезать эти два свойства, было исключить их в зависимости от того, содержит ли PropertyType или Name «Mock». Например:

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

Это пограничный хакер, но это единственный атрибут, который я могу найти для фильтрации. Я не думаю, что есть способ отфильтровать само отражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...