В процессе разработки кода мне часто требуется модульное тестирование некоторых строительных блоков класса, даже если они обычно являются частными. Если мои модульные тесты находятся внутри проекта, я могу использовать «Friend», чтобы выполнить это, и при этом сохранить функции закрытыми для нормального использования. Но я бы предпочел переместить свои тесты NUnit в отдельные отдельные проекты. Как добиться желаемого эффекта?
Как выполнить модульное тестирование частных функций из отдельного проекта в VB .NET?
Ответы (3)
Вы не можете (легко) протестировать частные методы из другого проекта, но довольно часто тестировать внутренние методы (Friend
в VB) из тестового проекта с помощью _ 2_. Это делает Friend
члена доступными для другой сборки.
Очевидно, это было новым в VB 9, хотя оно было доступно в C # 2 ... не совсем понимаю почему, но это сообщение в блоге Барта де Смета дает быстрый пример.
Обратите внимание, что если ваша производственная сборка подписана, ваша тестовая сборка также должна быть подписана, и вам нужно будет указать открытый ключ в InternalsVisibleToAttribute
аргументах. См. этот ответ о переполнении стека для получения дополнительных сведений.
InternalsVisibleto
можно найти здесь: stackoverflow.com/questions/1123683/ (также ответил Джон!).
- person Dan Atkinson; 18.11.2013
Вы можете использовать Reflection для вызова частных методов. Для этого существует множество образцов.
Из быстрого поиска в Google: http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
Основы: (это вставлено с сайта проекта кода, указанного выше)
public static object RunStaticMethod(System.Type t, string strMethod,
object [] objParams)
{
BindingFlags eFlags =
BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic;
return RunMethod(t, strMethod,
null, aobjParams, eFlags);
} //end of method
public static object RunInstanceMethod(System.Type t, string strMethod,
object objInstance, object [] aobjParams)
{
BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public |
BindingFlags.NonPublic;
return RunMethod(t, strMethod,
objInstance, aobjParams, eFlags);
} //end of method
private static object RunMethod(System.Type t, string
strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags)
{
MethodInfo m;
try
{
m = t.GetMethod(strMethod, eFlags);
if (m == null)
{
throw new ArgumentException("There is no method '" +
strMethod + "' for type '" + t.ToString() + "'.");
}
object objRet = m.Invoke(objInstance, aobjParams);
return objRet;
}
catch
{
throw;
}
} //end of method