2009-03-03 2 views

ответ

15

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

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

1

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

2

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

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

1

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

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

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

5

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

+0

вы говорите, что не рекомендовал бы это, но как бы вы решить что-то вроде этого? http://stackoverflow.com/questions/15440935/how-to-test-internal-class-library –

+0

@ Томас: точно так же, как говорит Эско в своем ответе. Вы либо косвенно проверяете внутренние API-интерфейсы через свой публичный интерфейс, либо рекламируете свои внутренние API-интерфейсы для публики и проверяете их напрямую. –

Смежные вопросы