Как выполнить модульное тестирование частных функций из отдельного проекта в VB .NET?

В процессе разработки кода мне часто требуется модульное тестирование некоторых строительных блоков класса, даже если они обычно являются частными. Если мои модульные тесты находятся внутри проекта, я могу использовать «Friend», чтобы выполнить это, и при этом сохранить функции закрытыми для нормального использования. Но я бы предпочел переместить свои тесты NUnit в отдельные отдельные проекты. Как добиться желаемого эффекта?


person user78369    schedule 15.03.2009    source источник


Ответы (3)


Вы не можете (легко) протестировать частные методы из другого проекта, но довольно часто тестировать внутренние методы (Friend в VB) из тестового проекта с помощью _ 2_. Это делает Friend члена доступными для другой сборки.

Очевидно, это было новым в VB 9, хотя оно было доступно в C # 2 ... не совсем понимаю почему, но это сообщение в блоге Барта де Смета дает быстрый пример.

Обратите внимание, что если ваша производственная сборка подписана, ваша тестовая сборка также должна быть подписана, и вам нужно будет указать открытый ключ в InternalsVisibleToAttribute аргументах. См. этот ответ о переполнении стека для получения дополнительных сведений.

person Jon Skeet    schedule 15.03.2009
comment
Что касается того, почему это было новым в VB9, это был компромисс между стоимостью и выгодой. VB имеет совсем другой способ разрешения имен, чем C #, и InternalsVisibleTo очень усложняет поиск имен. Это было слишком дорого для VB8 и, следовательно, упало до VB9. На самом деле мы вносим дальнейшие изменения в разрешение имен на (продолжение) - person JaredPar; 16.03.2009
comment
(продолжение) учтите это в VB10. - person JaredPar; 16.03.2009
comment
Стоит отметить, что информацию о подписании в контексте использования InternalsVisibleto можно найти здесь: stackoverflow.com/questions/1123683/ (также ответил Джон!). - person Dan Atkinson; 18.11.2013

Вы можете использовать Reflection для вызова частных методов. Для этого существует множество образцов.

person Danny G    schedule 15.03.2009
comment
И это тот, который мне больше всего помог: codeproject.com/KB/cs/testnonpublicmembers .aspx - person demoncodemonkey; 26.03.2009

Из быстрого поиска в 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
person Dan Williams    schedule 17.04.2009