Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Тестирование кода уровня доступности internal

#c_sharp #юнит_тесты


Cтруктура моего проекта(solution) следующая:

project Core type "Library" - библиотека где я реализовываю базовый
функционал: например здесь у меня реализована работа с бд;

project GUI type "WPF Application" - пользовательская часть, где я планирую использовать
public методы и функции;

project Test type "Unit test project" - здесь я занимаюсь тестированием методов и
функций из "Core";

class Default
{
     int counter = 0;

     int groupId
     {
        get
        {
        if (!(counter < 256))
        {
            counter = 0;
        }
        counter = counter + 1;
        return counter;
        }
     }

     public void SomeMethod()
     {

     }
}


Подскажите возможно ли тестировать методы/функции/свойства которые должны быть видны
только внутри "Core" (в приведенном примере это свойство groupId )если да то какой
уровень доступа должен быть у такого метода/функции/свойства и какой уровень доступа
должен быть у класса что бы он был доступен как в "GUI" так и для тестирования.

P.S.это читал, до конца не осознал, до сих пор использовал только public/private
модификаторы

Upd.:

Теперь я кажется понял как мне необходимо было сформулировать свой вопрос:

Мне непонятно какие уровни доступа необходимо ставить для приложений построенных
описанным мной образом, т.е. есть библиотека(отдельный проект) в ней есть методы которые
должны быть доступны из GUI(модификатор public), тестировать их не проблема, внутри
библиотеки есть методы которые которые должны быть доступны только внутри неё, в данном
случае groupId: данное свойство возвращает идентификатор для группы. я написал код,
но я же должен его каким то образом протестировать, да я проверил его сделав сначала
публичным написал тест посмотрел результат, изменил идентификатор удалил тест, но я
подумал что это не правильно, и должен быть способ сделать это иначе (спасибо @andreycha
за ответ). Так же я понял какой модификатор должен быть у Default(public спасибо @PashaPash).
А причина этого вопроса была в непонимании мной понятия "сборка".

P.S.S.: спасибо всем за приведенные ссылки. Для себя решил что внутренние методы
будут иметь идентификатор internal что бы была возможность их тестировать
    


Ответы

Ответ 1



Да, возможно. internal-типы доступны внутри сборки, в которой они объявлены, а также в других сборках, которые указываются в файле AssemblyInfo.cs текущего проекта c помощью атрибута InternalsVisibleTo: [assembly: InternalsVisibleTo("Test")]

Ответ 2



У не-вложенных классов (типов) есть всего два уровня доступности internal - класс виден только внутри сборки public - класс виден откуда угодно По умолчанию уровень доступа у класса - internal. Он видим только другим классам в той же сборке. Соответственно, из GUI вы не сможете получить доступ к Default, пока не поставите на него модификатор public. Если класс не должен быть виден в GUI (например, это какой-то служебный класс сборки), но вы хотите протестировать его отдельно, то можно использовать аттрибут InternalsVisibleTo, который позволит видеть internal вещи еще из из какой-то конкретной сторонней сборки (Test), но оставит их невидимыми для GUI. С видимостью методов - то же самое, но есть нюанс с самой необходимостью тестировать приватные методы. Если groupId у вас является приватным свойством, то скорее всего тестировать надо не сам groupId, а тот публичный метод, который его использует (например, SomeMethod). Этот вопрос подробно расписан в C# - Как тестрировать private и protected методы, со всеми за и против такого тестирования.

Комментариев нет:

Отправить комментарий