Лично мне не нравится разделять тесты по тестируемому коду.Если код написан так, чтобы он действительно был модульно-тестируемым , я считаю, что лучше иметь код модульного тестирования для определенного класса в том же файле, что и сам класс.Таким образом, разработчикам проще отслеживать модульные тесты, поскольку они вносят изменения или новые функции в код.
Однако отдельные проекты модульного тестирования почти необходимы, когда необходимо учитывать межсистемные зависимости.Разделение тестов ( интеграция , а не unit тесты) дает свободу настройки среды выполнения теста и позволяет избежать нежелательных фрагментов кода, вводимых в основную базу кода.С другой стороны, вам нужно будет использовать [assembly:InternalsVisibleTo("test_assembly_name")]
для включения тестового кода для доступа к внутренним элементам.
Условная компиляция может использоваться, чтобы избежать тестирования кода из сборок выпуска.Хотя в некоторых особых сценариях может быть полезно включить код модульного тестирования даже в сборку выпуска и позволить приложению выполнить самопроверку.Пример: интерфейс объявляется с семантическим контрактом, который должен предоставить разработчик для предоставления определенных атрибутов методам / свойствам / классу, реализующему интерфейс.Если приложение может загружать некоторые дополнительные модули (сборки, не известные во время компиляции), возможность самопроверки может помочь обеспечить работу всей системы.