- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在单元测试项目中测试私有(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/
我的结构基本上是这样的: abstract class A { protected string Identificator { get; set; } private void DoSo
我正在使用 Visual Studio 2017,我试图在 C# 中创建私有(private)方法的单元测试(代码如下): [TestClass] public class CalculatorTes
我正在尝试在单元测试项目中测试私有(private)方法。到目前为止一切顺利,但是当我必须测试带有 out 参数的方法时,我遇到了一个问题。该方法的签名是: private bool GotSSI(o
我读了this thread我想知道为什么有人应该使用 PrivateObject。我看不到任何通过纯反射在这么多步骤中无法实现的值(value)。此外,PrivateObject 还使用了反射。 该
我有一个小但很烦人的问题。 我正在使用 PrivateObject 进行一些测试以访问类中的各种方法。这一切都很好。然而,当方法签名包含“ref”时,ref 关键字似乎没有任何作用。 private
这个问题在这里已经有了答案: How to pass a parameter as a reference with MethodInfo.Invoke (2 个答案) 关闭 8 年前。 我正在尝试
我正在为计算软件编写单元测试。在测试用例中,我使用“PrivateObject”来访问私有(private)方法“sendNumberToCalculation()”,但我在未找到的类型上获取错误构造
我正在学习本教程,https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-mstest 但我没有可用的 Priv
我正在尝试在模拟对象上测试私有(private)方法。请冷静下来,我知道您正在拔干草叉。 我很清楚要说的一切都可以通过对我大喊 REFACTOR 来回答。我只需要一个直接的答案。有人看着我的眼睛告诉我
“反射”是指使用 System.Reflection 命名空间。 MSDN 谈到 PrivateObject 类:“允许测试代码......”。与 System.Reflection 相比,我更喜欢
是否可以使用 VS2010 单元测试类 PrivateObject 访问静态类中的私有(private)静态字段? 假设我有以下类(class): public static class foo {
如果我有私有(private)类 Class A { public static string foo; } 我可以使用反射来访问该静态字段吗?当然假设我不能更改代码... 我遇到的问题是类是
我正在测试一个属于层次结构的类。我一直在用被测对象和一个 PrivateObject 来设置我的测试类以允许访问该对象。当我尝试访问父类的私有(private)成员时出现异常。 到目前为止,我发现的唯
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
基本上,我的一些测试成功了,一些失败了。根据 Skeet 先生的出色建议,我创建了一个完整的代码示例以确认我没有疯。这是代码: namespace ClassLibrary { using S
我试图对私有(private)方法进行简单的单元测试,我让 VS2010 自动生成方法 stub 并添加缺少的信息:这是我的代码 [TestMethod()] [DeploymentI
我正在编写一个访问独立数据存储中文件的单元测试。文件名存储在类中的私有(private) const 字符串中,因为我不会在整个应用程序的其他任何地方使用它。 但是,当我运行单元测试时,当我调用 Pr
我是一名优秀的程序员,十分优秀!