Сокрытие функции - PullRequest
       28

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

2 голосов
/ 03 октября 2008

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

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

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

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

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

Последующие Up

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

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

Ответы [ 7 ]

14 голосов
/ 03 октября 2008

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

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

  2. В свойствах \ AssemblyInfo.cs проекта, содержащего DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

Если по какой-либо причине у вас есть две тестовые сборки, синтаксис:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]
5 голосов
/ 03 октября 2008

Украсьте свой метод этим атрибутом:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

Это скроет его от Intellisense.

РЕДАКТИРОВАТЬ:

Но, очевидно, это имеет довольно существенное предостережение: «В Visual C #, EditorBrowsableAttribute не подавляет членов из класса в одной сборке». Через MSDN .

4 голосов
/ 03 октября 2008

Предположим, вы хотите проверить этот объект, манипулируя его полями.

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

3 голосов
/ 03 октября 2008

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

1 голос
/ 03 октября 2008

Вы также можете использовать отражение. В поиске Google появился Юнит-тестирование частных методов с использованием отражения .

0 голосов
/ 03 октября 2008

В прошлом я делал XML-комментарии по методу и использовал этот раздел, чтобы писать большими жирными буквами. НЕ ИСПОЛЬЗУЙТЕ ЭТОТ МЕТОД или что-то еще. Таким образом, если кто-то попытается его использовать, Intellisense выдаст им приятное предупреждение.

0 голосов
/ 03 октября 2008

Может ли ваш тестовый код включать подкласс класса вычислений? Если это так, вы можете отметить функцию protected, и только наследники смогут использовать ее. Я почти уверен, что это также выводит меня из интеллигенции, но я могу ошибаться.

...