隐藏基本字段

时间:2013-07-10 16:53:49

标签: c# unit-testing inheritance mocking

我正在从System.DirectoryServices编写GroupPrincipal的存根实现,因此我可以对我正在编写的使用此类的代码进行单元测试。我需要将测试数据放入其中的一个属性是基类的只读属性。当模拟对象进入应用程序代码时,应用程序代码将其转换为基类,当它引用该字段时,它将获取基类引用而不是我的存根类中的引用。这是一个说明问题的单元测试:

class ClassWithString
{
    private string _AttributeToTest;
    public string AttributeToTest { get { return _AttributeToTest; } }
}
class StubClassWithString : ClassWithString
{
    public string AttributeToTest { get { return "This is my string"; } }
}
[TestMethod]
public void TestStubClassWithStringCastToClassWithString()
{
    ClassWithString toTest = new StubClassWithString();
    Assert.IsNotNull(toTest.AttributeToTest);
}

这个断言会失败。无论如何使用反射或任何其他技巧来获取引用(转换为基类)以返回子类的值?我试图避免在基类周围添加另一层抽象,如包装类。

1 个答案:

答案 0 :(得分:1)

如果要设置私有字段值,则可以使用以下扩展方法:

public static T SetPrivateFieldValue<T>(this T target, string name, object value)
{
    Type type = target.GetType();
    var flags = BindingFlags.NonPublic | BindingFlags.Instance;
    var field = type.GetField(name, flags);
    field.SetValue(target, value);
    return target;
}

用法:

ClassWithString toTest = new ClassWithString()
                              .SetPrivateFieldValue("_AttributeToTest", "Foo");

但是我不明白你试图用这种方式测试什么。内部实施应该保持内部。