модульное тестирование статического метода Main() в С#

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

public static void Main()
        {
            StructureMapBootstrapper.Register();
            SetupFilter<Applicant>();
        }

и это вызывает общий метод SetupFilter

private static void SetupFilter<T>() where T : IDataFilterBase, new()
        {
            var filterName = typeof(T).Name;
            if ("StartReceiver".TryGetTrueOrFalseConfigValue(filterName))
            {
                ObjectFactory.Configure(x => x.For<IDataFilterBase>().Use<T>());
                var filter = new T();
                filter.StartReceiver();
                LogHelper.LogInfo(string.Format("Started {0} Filter Service", filterName));
            }
            else
            {
                LogHelper.LogInfo(string.Format("{0} Filter Service NOT started. StartReceiver flag is set to false", filterName));
            }
        }

Первое, что пришло мне в голову, это использовать MOQ и убедиться, что метод SetupFilter вызывался хотя бы один раз, но компилятор жаловался на то, что метод статичен. Любая идея о том, как написать тест для этого метода? Как настроить его с помощью среды модульного тестирования VS и что мне нужно для подтверждения?


person Ted    schedule 13.05.2015    source источник
comment
Вы пытаетесь выполнить модульное тестирование своего контейнера IoC? И для чего этот сумасшедший метод расширения строк?   -  person Matti Virkkunen    schedule 13.05.2015
comment
Как вы собираетесь проводить модульное тестирование приватного метода?   -  person kamil-mrzyglod    schedule 13.05.2015
comment
ИМХО, вам не следует проводить модульное тестирование Main — возможно, вы сможете провести модульное тестирование того, что Main делает, но для истинного модульного теста потребуется, чтобы вы издевались над методами Register и SetupFilter, и просто убедитесь, что Main вызывает эти два метода, что, вероятно, не то, что вы хотите сделать.   -  person D Stanley    schedule 13.05.2015
comment
ИМО, нет смысла тестировать основной метод. Обычно при модульном тестировании метода вы тестируете одну из двух вещей: 1. возвращаемое значение или 2. что-то, что он сделал с состоянием приложения. В этом случае вы не устанавливаете возвращаемое значение Main, и состояние исчезает с выходом из Main.   -  person DWright    schedule 13.05.2015
comment
Как выглядит ваш существующий тест?   -  person forsvarir    schedule 13.05.2015
comment
@DStanley расскажи мне больше о своей идее. Насколько я понимаю, вы можете MOQ класса, а не метода. Кроме того, как упоминалось в моем исходном посте, причина, по которой я не могу использовать MOQ, заключается в том, что компилятор жалуется на то, что статические типы нельзя использовать в качестве аргументов типа. Потому что, когда вы MOQ, вы создаете новый класс, а статический класс не может быть создан...   -  person Ted    schedule 14.05.2015
comment
Я не уверен, о каком классе вы говорите, но да, вы не можете издеваться над статическими методами (или классами), потому что они связаны во время компиляции. Конечно, вы можете тестировать SetupFilter напрямую, но я не вижу смысла в модульном тестировании вашего метода запуска — это должно быть сделано как часть интеграционного тестирования.   -  person D Stanley    schedule 14.05.2015


Ответы (1)


На мой взгляд, вам нужно сделать небольшой рефакторинг вашего кода:

public class MyClass
{
    public static void Main()   
    {
       (new MyClass()).run();
    }
    public void Run()
    {
        StructureMapBootstrapper.Register();
        SetupFilter<Applicant>();
    }
}

Затем вы можете протестировать обычный метод вместо static

person Piotr Stapp    schedule 13.05.2015
comment
Я считаю, что проблема с операциями на самом деле связана с тем, что SetupFilter является статическим... а не основным. Вы исправили неправильную проблему. - person forsvarir; 13.05.2015