Правило 1: не пытайтесь кипятить океан.Тестируйте только небольшой фрагмент кода за раз.Для модульных тестов постарайтесь минимизировать внешние зависимости и взаимодействия.Это включает в себя не тратить время на проверку работоспособности основной операционной системы и, например, базовые классы, предоставляемые .NET Framework.Хорошо проверить, правильно ли ваш код взаимодействует с этими внешними вещами, но имейте в виду, что вы сосредоточены на тестировании написанного вами кода, а не на тестировании кода любого другого, который использует ваш код.
Проверка правильности совместной работы всех компонентов - это задача интеграционного тестирования, которое сильно отличается от схемы модульного тестирования.Интеграционное тестирование часто требует различных инструментов и разных тактик от модульного тестирования, и в конечном итоге преследует другие цели, чем модульное тестирование.
Если вы пишете свою собственную реализацию стандартного интерфейса ICollection, то вам следует выполнить модульное тестирование реализации вашей коллекции.В противном случае вам не нужно проверять, что вызов ICollection.Add () в классе коллекции акций, предоставляемом .NET, делает то, что должен.
Если ваш класс использует коллекцию внутри и предоставляет методы, которые манипулируютДля содержимого этой коллекции один из подходов состоит в том, чтобы использовать только открытые методы вашего класса, чтобы заставить класс изменить свое внутреннее состояние, и использовать только открытые методы, чтобы увидеть эффект этого действия.
Однако во многих ситуациях внутреннее состояние может быть не полностью раскрыто публичными методами.Вы можете ткнуть объект, но вы не можете точно увидеть, что произошло внутри.Абстракция хороша для проектирования системы, потому что она скрывает детали реализации от потребителей, так что детали могут быть изменены в будущем по мере необходимости, сохраняя тот же открытый интерфейс и семантический контракт.Сокрытие внутренних деталей хорошо для устойчивости и долговечности системы, но создает барьеры для тестирования.
В таких ситуациях полезно включить некоторый тип хука или интерфейса с классом, чтобы позволить вашим тестам взглянуть на внутреннее состояние.Это делает ваши тесты более тесно связанными с деталями реализации (измените код, и вам придется менять тесты тоже), но это также позволяет вашим тестам проводить гораздо более детальную оценку того, дают ли публичные действия желаемый эффект.о состоянии объекта, особенно когда объект намеренно скрывает это внутреннее состояние.
Одним из примеров такого внутреннего хука доступа является атрибут InternalsVisibleTo в .NET.Вы заявляете в своей производственной сборке, что ваша тестовая сборка может получить доступ к членам класса, объявленным с "внутренней" видимостью.То, что вы можете автоматически объявить закрытым, может быть добавлено к внутреннему, чтобы сделать его видимым для ваших модульных тестов.Данные по-прежнему защищены от обычных клиентов.
Еще один термин, на который следует обратить внимание, - это использование в тесте «фиктивных» классов.Mock - это фальшивый класс, который обеспечивает минимальную реализацию интерфейса или типа, необходимого для тестируемого кода, и используется для изоляции кода, который вы хотите протестировать, от внешнего кода, который вас не интересует прямо сейчас.
Например, если код, который вы тестируете, вызывает веб-сервис, будет трудно полностью протестировать все возможные способы сбоя вызова веб-сервиса - тайм-ауты, отказ в соединении, сбой разрешения DNS,и т. д. и т. д. Замена в фиктивном интерфейсе веб-службы позволяет вашему набору тестов манипулировать поставщиком данных, на который опирается ваш тестируемый код.Вы не тестируете поставщика данных, вы хотите проверить, как ваш код реагирует на ошибки, неверные данные и хорошие данные, возвращаемые поставщиком.Так что издевайтесь над провайдером и сами управляйте этими данными в наборе тестов.