使用RhinoMocks模拟私有字段

时间:2011-01-12 18:46:40

标签: rhino-mocks field private

我有以下类定义,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 :(得分:0)

如果CustomerAttribute是您的测试对象(SUT),并且IAttribute是需要模拟测试的依赖项,则IAttribute很可能需要注入CustomerAttribute。这应该通过构造函数(通常是首选)或属性注入来完成。如果您不熟悉它,请查看“控制倒置”。

此外,不应将ICustomerAttribute创建为模拟 - 应明确创建具体类型(即“new CustomerAttribute”)。毕竟,CustomerAttribute(实现!)就是您要测试的内容。

答案 1 :(得分:0)

我不确定你要在这里测试什么。如果要测试CustomerAttribute类而不是创建它的实例(而不是模拟ICustomerAttribute)。

要在CustomerAttribute上设置属性,您可以

  • 使用dependency injection注入正确的属性并在测试期间使用
  • 使用您为测试而创建的真实CustomerAttribute实例的反射