У меня есть класс по сложным научным вычислениям. Он настроен так, чтобы пользователь мог только создать правильно созданный случай. Однако для правильного тестирования кода требуется установка внутренних переменных состояния напрямую, поскольку справочные документы предоставляют эти данные в своих тестовых примерах. Однако при неправильном выполнении это может сделать состояние недействительным.
Итак, у меня должна быть возможность, функция-член, устанавливать внутренние переменные из программ модульного тестирования. Но я хочу, чтобы обычные пользователи сильно отговаривать не вызывали эту функцию. (Да, целеустремленный пользователь может гадить чем угодно ... но я не хочу говорить рекламировать, что есть способ что-то сделать неправильный.)
Было бы неплохо иметь возможность, например, указать Intellisense не показывать функцию.
Лучшее решение, которое у меня есть на данный момент, - просто назвать функцию примерно так: DangerousSet ().
Какие еще у меня есть варианты?
Следовать за
Я нашел ответ Эми Б. наиболее полезным в моей ситуации. Спасибо! Предложение Муфасы использовать отражение было отличным, но его сложнее реализовать (для меня). Предложение Криса об использовании декоратора было хорошим, но не сработало. Предложение BFree по XML также хорошо, и оно уже использовалось, но на самом деле не решает проблему.
Наконец, предположение BillTheLizard о том, что проблема в исходных документах, я не могу контролировать. Международные эксперты публикуют высокотехнологичные книги и журнальные статьи для своего сообщества. Тот факт, что они не удовлетворяют мои конкретные потребности, - это факт жизни. Альтернативных документов просто нет.





Вы можете использовать Внутренние элементы, чтобы пометить внутренние элементы как видимые для вашей тестовой сборки. Кажется, что он сияет, когда используется в этом контексте, хотя и не совсем «друг».
Отметьте функцию DangerousSet как internal вместо public.
В Properties \ AssemblyInfo.cs проекта, содержащего DangerousSet:
[assembly:InternalsVisibleTo("YourTestAssembly")]
Если по какой-либо причине у вас есть две тестовые сборки, синтаксис следующий:
[assembly:InternalsVisibleTo("TestAssembly1"),
InternalsVisibleTo("TestAssembly2")]
Может ли ваш тестовый код включать подкласс класса вычислений? В этом случае вы можете пометить функцию protected, и только наследники смогут ее использовать. Я почти уверен, что это также убирает его из intellisense, но я могу ошибаться.
Украсьте свой метод этим атрибутом:
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
Это скроет его от Intellisense.
Обновлено:
Но, по-видимому, здесь есть довольно существенное предостережение: «В Visual C# EditorBrowsableAttribute не подавляет члены из класса в той же сборке». Через MSDN.
Похоже, ваша настоящая проблема - в справочных документах. Вы не должны тестировать примеры, которые невозможно встретить при правильном использовании вашего класса. Если пользователям нельзя разрешать изменять состояние этих переменных, то и ваши тесты не должны.
Научно-исходные документы изменить нельзя. Они такие, какие есть. Они написаны международными экспертами в данной области, которых не волнует программирование (да и не должно быть).
Раньше я помещал XML-комментарии по методу и использовал раздел, чтобы писать большими жирными буквами. НЕ ИСПОЛЬЗУЙТЕ ЭТОТ МЕТОД или что-то еще. Таким образом, если кто-то попытается его использовать, Intellisense выдаст ему хорошее предупреждение.
Вы также можете использовать отражение. Поиск в Google показал Частные методы модульного тестирования с использованием отражения.
Предположим, вы хотите протестировать этот объект, манипулируя его полями.
public class ComplexCalculation
{
protected int favoriteNumber;
public int FavoriteNumber
{
get { return favoriteNumber; }
}
}
Поместите этот объект в тестовую сборку / пространство имен:
public class ComplexCalculationTest : ComplexCalculation
{
public void SetFavoriteNumber(int newFavoriteNumber)
{
this.favoriteNumber = newFavoriteNumber;
}
}
И напишите свой тест:
public void Test()
{
ComplexCalculationTest myTestObject = new ComplexCalculationTest();
myTestObject.SetFavoriteNumber(3);
ComplexCalculation myObject = myTestObject;
if (myObject.FavoriteNumber == 3)
Console.WriteLine("Win!");
}
PS: Я знаю, что вы сказали внутренний, но я не думаю, что вы имели в виду внутренний.
Это звучало как идеальное решение, но оно все равно появляется.