C #: проверка и тестирование защищенных (или частных) методов в закрытых классах - подходы - PullRequest
5 голосов
/ 20 января 2011

У меня есть запечатанный класс с защищенными методами, поведение которых я хочу проверить.Это затрудняет непосредственное тестирование и издевается.

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

Какие общие подходы возможны в этом случае?На данный момент у меня есть:

  1. Распечатать класс. Затем создайте прокси или адаптер, производный от класса в нашем тестовом коде, для туннелирования доступа к защищенному методу.
  2. Выделите поведение защищенного метода делегату / функтору и повторно-внедрить это. Затем самостоятельно протестируйте факторизованное поведение.
  3. Проверьте, вызвав ближайший публичный метод в иерархии наследования, который использует защищенный метод. Потенциально приводит к множеству насмешек и подверженности риску при изменении кода, отличного от тестируемого, - при создании хрупких тестов.
  4. Используйте отражение, чтобы получить доступ к защищенному методу. Тогда позвоните прямо.

Есть еще?

Ответы [ 5 ]

8 голосов
/ 20 января 2011

A protected метод в запечатанном классе фактически такой же, как private (я думаю, если вы закроете производный класс, где базовый класс имеет член protected, они могут возникнуть естественным образом.)

И нет смысла проверять private методы.Поскольку они не имеют поведения public, за исключением того, которое доступно через методы public определяющего класса, их поведение должно быть проверено путем тестирования методов public.

3 голосов
/ 20 января 2011

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

А зачем вам тестировать закрытые / защищенные методы? Вы можете использовать внутренние методы и InternalVisibleToAttribute для достижения этой цели. Но в целом вы должны проверять только публичное поведение (т.е. только публичный интерфейс).

2 голосов
/ 20 января 2011

Обычно я бы выбрал второй вариант, предполагая, что у вас есть возможность сделать изменения достаточно легко.Учитывая, что, если вы не можете проверить, что делает защищенный / приватный метод через его открытый интерфейс, он, вероятно, в любом случае не соответствует принципу Единой ответственности, и код, вероятно, мог бы быть разбит на два класса и вместо этого использовать композицию.

1 голос
/ 13 сентября 2016

Вы можете использовать фреймворк JustMock.Например:

double value = 0;
var fakeFilterSetHelper = Mock.Create<FilterSetHelper>(Behavior.CallOriginal);
Mock.NonPublic.Arrange<double>(fakeFilterSetHelper, memberName: "GetPriceRangeFromSession").Returns(value);
1 голос
/ 20 января 2011

Вы можете использовать некоторые фреймворки для насмешек - например, JustMock (от Telerik) поддерживает макет закрытых закрытых методов ... К сожалению, эта часть JustMock, я думаю, платная, но, по крайней мере, вы можете попробуйте пробную версию.

...