Я хотів би, щоб моя збірка Core не виставляла певний клас, і я все одно хотіла б мати можливість протестувати його. Як я можу це зробити?
Я хотів би, щоб моя збірка Core не виставляла певний клас, і я все одно хотіла б мати можливість протестувати його. Як я можу це зробити?
Відповіді:
InternalsVisibleTo приписувати порятунку!
Просто додайте:
[assembly:InternalsVisibleToAttribute("UnitTestAssemblyName")]
до вашого базового файлу AssemblyInfo.cs
Див. Асамблеї друзів (Посібник із програмування на C #), щоб отримати найкращі практики.
Наприклад, за допомогою InternalsVisible, якщо ваші збірки мають іменоване ім'я, вам потрібно вказати відкритий ключ (примітка: повний ключ, а не маркер відкритого ключа), наприклад ...
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("BoardEx_BusinessObjects.Tests,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100fb3a2d8 etc etc")]
і наступний трюк дійсно корисний для отримання відкритого ключа, не вдаючись до рядка cmd ...
http://www.andrewconnell.com/blog/archive/2006/09/15/4587.aspx
Я ставлю свої модульні тести в ту саму збірку, що і код, який він тестує. Для мене це має сенс, тому що я вважаю "перевірити себе" як особливість класу, поряд із такими речами, як "ініціалізувати себе" та "описати себе".
Я чув деякі заперечення проти цього підходу, але мало хто з них був переконливим.
Це шкодить продуктивності Бах, кажу! Не оптимізуйте без надійних даних! Можливо, якщо ви плануєте завантажувати свої збірки за повільними посиланнями, тоді мінімізація розміру збірки буде доцільною.
Це ризик для безпеки . Тільки якщо у вас є секрети в тестах. Не роби цього.
Зараз ваша ситуація відрізняється від моєї, тож, можливо, це матиме для вас сенс, а можливо, ні. Вам доведеться це зрозуміти самому.
Крім: У C # я якось спробував помістити свої модульні тести в клас із назвою "Тести", який був вкладений всередину класу, який він тестував. Це зробило очевидною правильну організацію речей. Він також уникнув дублювання імен, що виникає, коли тести для класу "Foo" знаходяться в класі під назвою "FooTests". Однак модульні модулі тестування, до яких я мав доступ, відмовились приймати тести, які не були позначені як "загальнодоступні". Це означає, що клас, який ви тестуєте, не може бути "приватним". Я не можу придумати жодної вагомої причини вимагати, щоб тести були "публічними", оскільки насправді їх ніхто не називає загальнодоступними методами - все відбувається через рефлексію. Якщо ви коли-небудь пишете фреймворк модульного тестування для .Net, будь ласка, ради мене дозвольте непублічні тести!
[Conditional("DEBUG")]
на тестових класах, то вони не повинні знаходитись у виробничій збірці і не шкодити продуктивності.
Я б радив не переходити до таких проблем ... якщо ви дійсно хочете перевірити модульні свої "внутрішні" класи, просто сховайте їх у просторі імен, який в кінцевому підсумку використовуватиме лише ваш внутрішній код. Якщо ви не пишете рамки в масштабі платформи .NET, що не на самому ділі потрібно , що рівень приховування.