C# 正在运行System.MissingMethodException:未找到PrivateObject的方法
基本上,我的一些测试是成功的,一些是失败的。根据Skeet先生的建议,我创建了一个完整的代码示例,以确认我没有发疯。代码如下:C# 正在运行System.MissingMethodException:未找到PrivateObject的方法,c#,unit-testing,C#,Unit Testing,基本上,我的一些测试是成功的,一些是失败的。根据Skeet先生的建议,我创建了一个完整的代码示例,以确认我没有发疯。代码如下: namespace ClassLibrary { using System; public class Manager { private int SampleMethod(int id) { return id; } } } 我的测试是: namespace U
namespace ClassLibrary
{
using System;
public class Manager
{
private int SampleMethod(int id)
{
return id;
}
}
}
我的测试是:
namespace UnitTestProject
{
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class UnitTest
{
[TestMethod]
public void TestPasses()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
var actual = privateInfo.Invoke("SampleMethod", 1);
}
[TestMethod]
public void TestErrorsOut()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
var actual = privateInfo.Invoke("SampleMethod", 0);
}
[TestMethod]
public void TestWorksAsWell()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
privateInfo.Invoke("SampleMethod", new object[] { 0 });
}
[TestMethod]
public void TestAlsoErrorsOut()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
var types = new Type[] { typeof(int) };
var actual = privateInfo.Invoke("SampleMethod", types, 0);
}
}
}
第一个测试(testpasss())有效
第二个测试(TestErrorOut())失败,出现以下错误:
{“找不到方法”ClassLibrary.Manager.SampleMethod'
令人困惑的是,误差是一致的,但实际测试几乎是相同的。这毫无意义。我在VS2012 RC和VS2010上尝试了这一点,得到了相同的结果
我能想到的唯一一件事是“0”被转换为int以外的内容,这意味着它找不到SampleMethod的方法签名?我尝试了第三个测试来显式传递我要查找的类型(testalsoErrorOut()),但这也会导致相同的错误
想法?谢谢
编辑以添加
通过使用Ian关于使用obj[]而不是params obj[]重载的建议,它可以工作(test testworkswell())。这就解释了TestalSoErrorOut()失败的原因,因为我使用的是params方法,它不适用于[]类型。所以,这是固定的。但是,为什么?为什么在传递1而不是0时,params obj[]会起作用 根据docs(),参数应该作为对象数组传递。显式传递对象数组似乎工作正常:
var actual = (int)privateInfo.Invoke("SampleMethod", new object[] {0});
单独传递0似乎会导致编译器选择此重载
Invoke(string name = "SampleMethod", System.Reflection.BindingFlags bindingFlags = Default, object[] args = {object[0]})
调用以下测试时,我得到System.MissingMethodException:
PrivateObject shadow = new PrivateObject(target);
shadow.Invoke("PrivateMethod", new string[]{"arg1","arg2"});
关于目标的私有方法签名
private void PrivateMethod(string[] args)
我必须将参数添加到私有方法签名中以解决异常,如下所示:
private void PrivateMethod(params string[] args)
伊恩·吉尔罗伊是对的,但原因是;这是因为
PrivateObject.Invoke
有许多签名,其中之一是:Invoke(字符串名称、类型[]类型、对象[]对象)
在我的例子中,我传递的值如下:
Invoke(“MethodName”,null,null)
,在这种情况下,C#编译器更喜欢提到的签名,而不是Invoke(string name,params object[]objects)
,这会导致错误。您能展示一个简短但完整的程序来演示这个问题吗?是l的输入错误还是类似的错误?为什么你想对一个私有方法进行单元测试?@Anuraj-我同意这篇关于“为什么”的文章,但我认为这不是讨论这个问题的论坛。在我的例子中,我将其命名为var inputObj=新对象[2];即使我只传递了一个输入参数。。更改为var inputObj=新对象[1];解决了我的问题