Как я могу сделать HttpContext доступным для моих модульных тестов?

Я хочу написать модульный тест, который проверяет функцию класса с именем UploadedFile.

Проблема, с которой я сталкиваюсь, заключается в том, что статический конструктор этого класса использует свойство HttpContext.Current, и поскольку я выполняю свой модульный тест из библиотеки классов, у меня нет HttpContext во время тестирования.

Посмотрите на мой статический конструктор:

static UploadedFile()
{
    if (HttpContext.Current == null)
        throw new Exception("web server not available");

    HttpServerUtility server = HttpContext.Current.Server;

    // SET UploadedFileMappingFile Names:
    _resourceFileNames = new StringDictionary();

    _resourceFileNames[_suppoertedFileStructures] = server.MapPath(SupportedUploadedFileStructures);
    _resourceFileNames[_supportedFileStructuresXSD] = server.MapPath(SupportedUploadedFileStructuresXSD);

    _resourceFileNames[UploadedFileEnum.UploadedFileFormatENUM.CSV.ToString()] = server.MapPath(UploadedFileColumnMap);        
}

Что мне делать в моей тестовой среде, чтобы HttpContext.Current не будет нулевым, и я могу успешно установить это:

 HttpServerUtility server = HttpContext.Current.Server;

1 ответ

Решение

Вы не должны использовать HttpContext.Current непосредственно в вашей функции, поскольку это почти невозможно для модульного тестирования, как вы уже узнали. Я бы предложил вам использовать вместо этого HttpContextBase, который передается либо в конструкторе вашего класса, либо в качестве аргумента для метода, который вы тестируете. Это позволит потребителям этого класса проходить реальный HttpContextWrapper, и в вашем модульном тесте вы можете высмеивать нужные вам методы.

Например, вот как вы можете вызвать метод:

var wrapper = new HttpContextWrapper(HttpContext.Current);
Foo.UploadedFile(wrapper);

И в вашем модульном тесте (используя Rhino Mocks):

var contextMock = MockRepository.GenerateMock<HttpContextBase>();
// TODO: Define expectations on the mocked object
Foo.UploadedFile(contextMock);

Или, если хотите, используйте Constructor Injection.

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