тестирование внутреннего класса - PullRequest
5 голосов
/ 03 марта 2009

как писать модульные тесты для внутренних классов ???

Ответы [ 6 ]

15 голосов
/ 03 марта 2009

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

Если внутренний класс не может быть адекватно протестирован через интерфейс класса верхнего уровня, то обычно лучше удалить внутренний класс и проверить его непосредственно как новый класс верхнего уровня. Желание протестировать внутренние классы - это запах кода, который может быть достаточно важным для того, чтобы быть классом верхнего уровня.

5 голосов
/ 03 марта 2009

Не то, чтобы я рекомендовал это, но вы также можете использовать InternalsVisibleToAttribute .

2 голосов
/ 03 марта 2009

Вы не проверяете это напрямую. Это будет проверено через класс, где это определено.

И, если вы применяете TDD, как в настоящее время подразумевают теги этого вопроса, какой тест вы просто пишете, который вызывает внутренний класс? Я имею в виду, не может ли это быть стандартный класс, находящийся в частной собственности класса, над которым вы работаете?

2 голосов
/ 03 марта 2009

При использовании MS Visual Studio для модульных тестов вам нужно просто создать частный Accessor . Внутренне это работает с отражениями, я думаю. Просто взгляните на сгенерированный код.

1 голос
/ 03 марта 2009

Мы использовали вспомогательный класс, который использует отражение для загрузки и вызова методов во внутренних классах. Также возможно изменить доступность во время компиляции, используя символ DEBUG, например

#if DEBUG
public
#else
internal
#endif
    class MyInternalClass
{
    ...
}

Однако ответ Эско Луонтолы является более правильным, поскольку наиболее важны функциональные или бизнес-требования. Легко слишком сосредоточиться на покрытии кода, а не тестировать важные области риска.

0 голосов
/ 30 июня 2011

См. Подробные объяснения от http://msdn.microsoft.com/en-us/library/bb385974.aspx

...