Как мне тестировать приватные функции из отдельного проекта в VB .NET? - PullRequest
5 голосов
/ 16 марта 2009

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

Ответы [ 3 ]

11 голосов
/ 16 марта 2009

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

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

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

3 голосов
/ 16 марта 2009

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

1 голос
/ 17 апреля 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
...