Дразнить частные поля с RhinoMocks - PullRequest
0 голосов
/ 12 января 2011

У меня есть следующее определение класса, согласно которому поле 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();

    }

Ответы [ 2 ]

0 голосов
/ 14 января 2011

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

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

  • Использовать внедрение зависимостей , чтобы ввести правильный атрибут и использовать его во время тестирования
  • Использовать отражение реального экземпляра CustomerAttribute, который вы создали для тестирования
0 голосов
/ 12 января 2011

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

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

...