gpt4 book ai didi

c# - PrivateObject 不会返回参数

转载 作者:太空狗 更新时间:2023-10-29 17:46:42 26 4
gpt4 key购买 nike

我正在尝试在单元测试项目中测试私有(private)方法。到目前为止一切顺利,但是当我必须测试带有 out 参数的方法时,我遇到了一个问题。该方法的签名是:

private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}

单元测试(不工作的部分)看起来像这样:

SSI ssi = null;
object[] p = new object[]{ssi,rsi};
Type[] t = new Type[] { typeof(SSI).MakeByRefType(), typeof(RSI) };
actual = (bool) privateTarget.Invoke("GotSSI",t,p);

GotSSI 方法有效。我已经在单元测试中以 Debug模式对其进行了测试,我可以看到“ssi”输出变量在方法内部设置,然后返回它的真值或假值。但是当测试返回到它自己的代码时,“ssi”变量仍然为空。所以问题是我在“GotSSI”方法中创建的对象没有从 PrivateObject 调用方法中解析出来。

有人知道我错过了什么吗?

更新(Rafal 的解决方案)

Rafal 的解决方案非常有效,下面是我如何实现该解决方案。

我创建了一个委托(delegate):

delegate bool GotSSIInternal(out SSI ssi, RSI rsi);

当我创建了我想要测试的对象后,我构建了委托(delegate)(目标是我正在测试的对象):

GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));

之后调用委托(delegate)就很简单了:

actual = gotSSIInternal.Invoke(out ssi, rsi);

解决方案非常简单,而且效果很好。

最佳答案

虽然被接受的最终解决方案有效,但还有一种更简单的方法来实现。如果你点击 Rafal 接受的答案中给出的链接,你会发现一个与这个问题类似的问题,有两个答案。第二个答案(具有最“有用”的要点)是两者中较简单的一个。

这是专门针对测试场景的答案的修改版本:

//method to test is a private method of the class ClassTotest with signature 
// TryGetCustomerData(List<Invoice> invoices, out CustomerData customerData)
//set up
var objToTest = new ClassToTest();
var invoices = GetInvoices();
CustomerData customerData = null;

//set up the arguments
var args = new object[] { invoices, customerData };
//get the MethodInfo of the method you want to test
var method = typeof(ClassToTest).GetMethod("TryGetCustomerData",
BindingFlags.NonPublic | BindingFlags.Instance);
//invoke it
var success = (bool)method.Invoke(objToTest, args);
//get back the customerData argument - the "out" parameter
var actual = args[1] as CustomerData;

关于c# - PrivateObject 不会返回参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213492/

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