2010-08-13 2 views
6

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

Проблема, с которой я сталкиваюсь, это статический конструктор этого класса, использует свойство 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; 

ответ

10

вы не должны» t используйте 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.

+0

Спасибо за идею! К сожалению, я до сих пор не использовал Rhino.Mocks.dll. Кажется, мне нужно сначала познакомиться с этим, тогда я попытаюсь реализовать ваше предложение. Благодаря! – pencilCake