C# MSTest PrivateType.InvokeStatic()抛出MissingMethodException
在3个多小时的挫折之后,我决定问 我有一个简单的类需要测试:C# MSTest PrivateType.InvokeStatic()抛出MissingMethodException,c#,mstest,missingmethodexception,C#,Mstest,Missingmethodexception,在3个多小时的挫折之后,我决定问 我有一个简单的类需要测试: public class Organizer { private static bool Bongo(String p) { return p != null && p.Length >= 5; } private static int ValidateArgs(String[] args) { return args.Length; } } 我
public class Organizer {
private static bool Bongo(String p) {
return p != null && p.Length >= 5;
}
private static int ValidateArgs(String[] args) {
return args.Length;
}
}
我使用MSTest测试静态方法的代码:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
public class OrganizerTest {
[TestMethod]
public void TestBongo() {
PrivateType psOrganizers = new PrivateType(typeof(Organizer));
// This one works fine.
Assert.IsTrue(Convert.ToBoolean(psOrganizers.InvokeStatic("Bongo", "ABCDEFG")));
// Fails with: "System.MissingMethodException: Method 'Organizer.Bongo' not Found.
Assert.IsFalse(Convert.ToBoolean(psOrganizers.InvokeStatic("Bongo", null)));
}
[TestMethod]
public void TestBodo() {
PrivateType psOrganizers = new PrivateType(typeof(Organizer));
String[] fakeArray = new String[] { "Pizza" };
// Fails with: "System.MissingMethodException: Method 'Organizer.ValidateArgs' not Found.
int result1 = Convert.ToInt32(psOrganizers.InvokeStatic("ValidateArgs", fakeArray));
// Fails with: "System.MissingMethodException: Method 'Organizer.ValidateArgs' not Found.
int result2 = Convert.ToInt32(psOrganizers.InvokeStatic("ValidateArgs", "A", "B", "C", "D"));
// Fails with: "System.MissingMethodException: Method 'Organizer.ValidateArgs' not Found.
int result3 = Convert.ToInt32(psOrganizers.InvokeStatic("ValidateArgs", new Object[] { "A", "B", "C", "D" }));
Assert.IsTrue(result1 == 1 && result2 == 4 && result3 == 4);
}
}
除了TestBongo中的第一个断言外,由于MissingMethodException,其他每个断言都会失败。有许多InvokeStatic()重载,我怀疑可能是编译器没有选择我期望的重载
顺便说一句,请不要告诉我不要测试私有方法。我不是在找辩论。:)
谢谢。InvokeStatic的最后一个参数是
params
参数,因此在这些情况下它的用法有点混乱。在第一种情况下,传递null似乎被视为试图调用没有参数的方法。试一试
psOrganizers.InvokeStatic("Bongo", new object[] { null })
使用null调用Bongo
在第二种情况下,String[]
是隐式可转换的Object[]
,因为。字符串数组将作为参数列表而不是所需的单个参数传递。您需要将字符串数组包装到另一个数组中,以使其正常工作。试一试
psOrganizers.InvokeStatic("ValidateArgs", new object[] { new string[] { "A", "B", "C", "D" } })
要调用
ValidateArgs
,InvokeStatic
的最后一个参数是params
参数,因此在这些情况下,它的用法有点混乱。在第一种情况下,传递null似乎被视为试图调用没有参数的方法。试一试
psOrganizers.InvokeStatic("Bongo", new object[] { null })
使用null调用Bongo
在第二种情况下,String[]
是隐式可转换的Object[]
,因为。字符串数组将作为参数列表而不是所需的单个参数传递。您需要将字符串数组包装到另一个数组中,以使其正常工作。试一试
psOrganizers.InvokeStatic("ValidateArgs", new object[] { new string[] { "A", "B", "C", "D" } })
要调用
ValidateArgs
,InvokeStatic
的最后一个参数是params
参数,因此在这些情况下,它的用法有点混乱。在第一种情况下,传递null似乎被视为试图调用没有参数的方法。试一试
psOrganizers.InvokeStatic("Bongo", new object[] { null })
使用null调用Bongo
在第二种情况下,String[]
是隐式可转换的Object[]
,因为。字符串数组将作为参数列表而不是所需的单个参数传递。您需要将字符串数组包装到另一个数组中,以使其正常工作。试一试
psOrganizers.InvokeStatic("ValidateArgs", new object[] { new string[] { "A", "B", "C", "D" } })
要调用
ValidateArgs
,InvokeStatic
的最后一个参数是params
参数,因此在这些情况下,它的用法有点混乱。在第一种情况下,传递null似乎被视为试图调用没有参数的方法。试一试
psOrganizers.InvokeStatic("Bongo", new object[] { null })
使用null调用Bongo
在第二种情况下,String[]
是隐式可转换的Object[]
,因为。字符串数组将作为参数列表而不是所需的单个参数传递。您需要将字符串数组包装到另一个数组中,以使其正常工作。试一试
psOrganizers.InvokeStatic("ValidateArgs", new object[] { new string[] { "A", "B", "C", "D" } })
调用
ValidateArgs
谢谢,迈克。就这样,谢谢你,迈克。就这样,谢谢你,迈克。就这样,谢谢你,迈克。就这样。