Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在运行System.MissingMethodException:未找到PrivateObject的方法_C#_Unit Testing - Fatal编程技术网

C# 正在运行System.MissingMethodException:未找到PrivateObject的方法

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

基本上,我的一些测试是成功的,一些是失败的。根据Skeet先生的建议,我创建了一个完整的代码示例,以确认我没有发疯。代码如下:

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];解决了我的问题