0

我正在从 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);
}

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

4

1 回答 1

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");

但我不明白你想用这种方式测试什么。内部实现应该留在内部。

于 2013-07-10T17:39:02.807 回答