我已經使用了幾種方法來做到這一點。我已經使我的私有方法受到保護,以便我可以在單元測試中從類繼承,並創建一個「助手」類來測試這些方法。另一個是反思。反思是更容易海事組織,但確實違背了你的類應該如何設計測試。這是我正在談論的簡化版本。
public static class ReflectionHelper
{
public static object RunStaticMethod<TInstance>(string methodName, params object[] methodParams)
{
var methodType = BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
return RunMethod<TInstance>(null, methodName, methodType, methodParams);
}
public static object RunInstanceMethod<TInstance>(this TInstance instance, string methodName, params object[] methodParams)
{
var methodType = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
return RunMethod<TInstance>(instance, methodName, methodType, methodParams);
}
private static object RunMethod<TInstance>(object instance, string methodName, BindingFlags methodType, params object[] methodParams)
{
var instanceType = typeof(TInstance);
var method = instanceType.GetMethod(methodName, methodType);
if (method == null)
{
throw new ArgumentException(string.Format("There is no method '{0}' for type '{1}'.", methodName, instanceType));
}
var result = method.Invoke(instance, methodParams);
return result;
}
}
鑑於一類像這樣
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
internal string GetPrettyName()
{
return string.Concat(FirstName, " ", LastName);
}
static internal int GetSystemId(string userName)
{
// some magic here
return 13;
}
}
你會使用這些作爲使
var user = new User { FirstName = "Peter", LastName = "Gibbons" };
var name = user.RunInstanceMethod("GetPrettyName");
Assert.That(name, Is.EqualTo("Peter Gibbons"));
var id = ReflectionHelper.RunStaticMethod<User>("GetSystemId", "tester");
Assert.That(id, Is.EqualTo(13));
這是對我的情況最有效的答案,只需要添加一行 - 確實是一個寶石。有人downvoted它沒有說明原因,雖然... – Evgeny 2009-09-03 01:15:38
我很好奇downvote了。以這種方式測試內部結構與其他方法有什麼不同嗎? – 2009-09-03 03:20:40
鏈接已經死了 – 2013-01-17 16:36:01