Вопрос

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

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

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

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

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

Следовать за

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

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

Это было полезно?

Решение

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

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

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

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

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

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

    [assembly:InternalsVisibleTo("YourTestAssembly")]

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

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

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

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

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

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

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

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

Вы также можете использовать отражение. Поисковик Google обнаружил модульное тестирование частных методов с использованием рефлексии .

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

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

scroll top