我正在尝试在单元测试项目中测试私有方法.到目前为止,它变得很棒,但是当我必须使用out参数测试方法时,我遇到了一个问题.该方法的签名是:
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
Run Code Online (Sandbox Code Playgroud)
unittest(不工作的部分)看起来像这样:
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);
Run Code Online (Sandbox Code Playgroud)
GotSSI方法有效.我已经在单元测试中以调试模式测试了它,我可以看到'ssi'out变量在方法内设置,然后返回它的true或false值.但是当测试返回到它自己的代码时,'ssi'变量仍为null.所以问题是我在"GotSSI"方法中创建的对象没有从PrivateObject调用方法中解析出来.
谁知道我错过了什么?
更新(拉法尔解决方案)
Rafal的解决方案完美无缺,这就是我实施解决方案的方式.
我创建了一个代表:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
Run Code Online (Sandbox Code Playgroud)
当我创建了我想要测试的对象时,我构建了委托(目标是我正在测试的对象):
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
Run Code Online (Sandbox Code Playgroud)
之后调用委托非常简单:
actual = gotSSIInternal.Invoke(out ssi, rsi);
Run Code Online (Sandbox Code Playgroud)
解决方案非常简单,就像一个魅力.
我正在尝试通过从已经创建的另一个表单继承来创建表单。原因是原始表单实际上具有3个状态,并且继承结构将使调试,理解和改进变得更容易。
问题是我的Visual Studio 2008表单设计器对这个想法不太满意。我可以设计出一条错误消息,而不是表格:
无法显示该文件的设计器,因为无法设计其中的所有类。设计人员检查了文件中的以下类:InheritedForm ---无法加载基类'MyBaseForm'。确保已引用该程序集,并且已构建所有项目。
基本上,我在设计器中看不到继承的表单,但是原始表单在设计器中可以正常工作。
这非常令人沮丧,因此为确保问题不是VS2008的问题,我创建了一个全新的干净Forms项目(.net 2.0),并创建了一个名为Form1的表单以及一个从Form1继承的表单(Form2)。该项目工作正常。我可以在设计器中看到Form1,也可以在Form2中看到添加到Form1的标签,但是由于它属于Form 1,所以无法在Form2中移动它。
测试的结果证明了我的Visual Studio确实可以运行。只是不在我需要它才能工作的原始项目中。我尝试过的另一件事是,当您使用《 VS2008指南》创建继承表单时,通过“继承选择器”创建继承自。在我的测试项目中,我可以看到自己创建的所有表格,但是在我的原始作品中,我什么也不能选择。我试图浏览到我的bin文件夹中的exe文件,但没有提供任何形式的选择。
我还尝试过重建项目,清理项目并重新启动VS2008,希望它处于某种奇怪的状态,但是没有任何帮助。我不会否认我有一些奇怪的项目设置可能会影响Designer的想法,因为项目文件有些旧,并且包含许多文件和元素。但是由于我得到的错误描述,我发现这不太可能(仍在对此进行调查)。
我一直在搜寻互联网,以至于无论我在Google的搜索字段中输入什么内容或进行链接浏览,都得到相同的文章,论坛或博客,但没有成功。你们中的任何人对什么可能导致我的问题有想法或建议吗?非常感谢您提供的任何帮助,提示或建议。
先感谢您。