gpt4 book ai didi

c# - 如何使用 PrivateObject 访问我的类及其父类的私有(private)成员?

转载 作者:IT王子 更新时间:2023-10-29 04:26:36 28 4
gpt4 key购买 nike

我正在测试一个属于层次结构的类。我一直在用被测对象和一个 PrivateObject 来设置我的测试类以允许访问该对象。当我尝试访问父类的私有(private)成员时出现异常。

到目前为止,我发现的唯一解决方法是将指定基类的 PrivateType 传递给 PrivateObject 构造函数,但它不适用于私有(private)成员的子类。

有什么方法可以做到这一点,也许是通过在 Private 对象的 Get* 方法上使用绑定(bind)标志参数?

我确实尝试过使用自动生成的访问器类(在主类中右键单击,创建私有(private)访问器)。然而,更糟糕的是:它显示了一个我可以读取的属性,但它抛出了与 PrivateObject 相同的异常,而且我没有其他选项(绑定(bind)标志或诸如此类)可以用来修复异常。

这是我的示例测试代码。我希望有某种方法来构造和使用 PrivateObject 来检索这两个字段。

public class BaseClass
{
private int one = 1;
}

public class SubClass : BaseClass
{
private int two = 2;
}

[TestClass]
public class UnitTest1
{
BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

[TestMethod]
public void TestMethod1()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test);

Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.SubClass.one' not found.
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags));
}

[TestMethod]
public void TestMethod2()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test, new PrivateType(typeof(BaseClass)));

Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags));
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.BaseClass.two' not found.
}
}

最佳答案

我没有找到答案,所以这就是我最终要做的。我为类层次结构的每个级别创建了 PrivateObjects,我只需要在编写测试用例时小心使用正确的测试用例即可。

public class BaseClass
{
private int one = 1;
}

public class SubClass : BaseClass
{
private int two = 2;
}

[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod()
{
SubClass test = new SubClass();
PrivateObject privSub = new PrivateObject(test, new PrivateType(typeof(SubClass)));
PrivateObject privBase = new PrivateObject(test, new PrivateType(typeof(BaseClass)));

Assert.AreNotEqual<int>(0, (int)privBase.GetFieldOrProperty("one"));
Assert.AreNotEqual<int>(0, (int)privSub.GetFieldOrProperty("two"));
}
}

关于c# - 如何使用 PrivateObject 访问我的类及其父类的私有(private)成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396996/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com