Скрытие функции

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

Итак, у меня должна быть возможность, функция-член, устанавливать внутренние переменные из программ модульного тестирования. Но я хочу, чтобы обычные пользователи сильно отговаривать не вызывали эту функцию. (Да, целеустремленный пользователь может гадить чем угодно ... но я не хочу говорить рекламировать, что есть способ что-то сделать неправильный.)

Было бы неплохо иметь возможность, например, указать Intellisense не показывать функцию.

Лучшее решение, которое у меня есть на данный момент, - просто назвать функцию примерно так: DangerousSet ().

Какие еще у меня есть варианты?

Следовать за

Я нашел ответ Эми Б. наиболее полезным в моей ситуации. Спасибо! Предложение Муфасы использовать отражение было отличным, но его сложнее реализовать (для меня). Предложение Криса об использовании декоратора было хорошим, но не сработало. Предложение BFree по XML также хорошо, и оно уже использовалось, но на самом деле не решает проблему.

Наконец, предположение BillTheLizard о том, что проблема в исходных документах, я не могу контролировать. Международные эксперты публикуют высокотехнологичные книги и журнальные статьи для своего сообщества. Тот факт, что они не удовлетворяют мои конкретные потребности, - это факт жизни. Альтернативных документов просто нет.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
366
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

  1. Отметьте функцию DangerousSet как internal вместо public.

  2. В 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.

Это звучало как идеальное решение, но оно все равно появляется.

Mark T 03.10.2008 20:36

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

Научно-исходные документы изменить нельзя. Они такие, какие есть. Они написаны международными экспертами в данной области, которых не волнует программирование (да и не должно быть).

Mark T 03.10.2008 20:42

Раньше я помещал 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: Я знаю, что вы сказали внутренний, но я не думаю, что вы имели в виду внутренний.

Другие вопросы по теме