Мокинг частных полей с помощью RhinoMocks

У меня есть следующее определение класса, согласно которому поле attribute гидратируется посредством отражения NHibernate. Поле не отображается как объект, но вместо этого я хочу скрыть его реализацию и просто предоставить свойства, которые ссылаются на свойства поля attribute.

    public class CustomerAttribute : ICustomerAttribute
{
    private IAttribute attribute;

    public string DisplayName 
    {
      get { return attribute.DisplayName;}

    }

}

Я пытаюсь имитировать этот объект с помощью RhinoMocks, но не знаю, как увлажнить поле attribute для тестирования. Я пробовал установить поле attribute вручную через отражение, но получаю ошибку прокси от RhinoMocks (что имеет смысл).

Итак, как мне гидратировать поле attribute, чтобы я мог проверить свойства объекта CustomerAttribute?

Вот мой тест прямо сейчас ...

        [Test]
    public void PropertiesTest()
    {
        MockRepository mock = new MockRepository();
        ICustomerAttribute attribute = mock.StrictMock<ICustomerAttribute>();

        //Set the attribute field
        FieldInfo fieldInfo = typeof(CustomerAttribute).GetField("attribute",
                                                      BindingFlags.Instance | BindingFlags.SetField |
                                                      BindingFlags.NonPublic);

        fieldInfo.SetValue(attribute, new Domain.Attribute()); //This does not work

        Expect.Call(attribute.DisplayName).Return("Postal Code");
        mock.ReplayAll();

        Assert.AreEqual(true, attribute.DisplayName);
        mock.VerifyAll();

    }

person Kyle Novak    schedule 12.01.2011    source источник


Ответы (2)


Если CustomerAttribute - ваш объект тестирования (SUT), а IAttribute - это зависимость, которую нужно имитировать для тестирования, то IAttribute, скорее всего, нужно будет внедрить в CustomerAttribute. Это должно быть сделано либо с помощью конструктора (обычно предпочтительнее), либо с помощью внедрения свойства. Загляните в «Инверсию управления», если вы еще не знакомы с ней.

Кроме того, ICustomerAttribute НЕ должен создаваться как макет - конкретный тип должен быть создан явно (например, «новый CustomerAttribute»). В конце концов, CustomerAttribute (реализация!) - это то, что вы пытаетесь протестировать.

person Phil Sandler    schedule 12.01.2011

Я не уверен, что вы пытаетесь здесь протестировать. Если вы хотите протестировать свой класс CustomerAttribute, вам нужно создать его экземпляр (вместо имитации ICustomerAttribute).

Чтобы установить атрибут в свой CustomerAttribute, вы можете либо

  • Используйте внедрение зависимостей, чтобы ввести правильный атрибут и использовать его во время тестирования.
  • Используйте отражение реального экземпляра CustomerAttribute, созданного вами для тестирования.
person Grzenio    schedule 14.01.2011