2014-08-27 12 views
0

Учитывая проект ASP.NET с некоторыми файлами в структуре, которые имеют Содержание, перечисленные в качестве их Build Action, как это относится к этому контенту таким образом, который работает как для IIS, так и для пакета тестирования Visual Studio?Как вы относитесь к ASP.NET «Контент» для обеспечения совместимости с тестированием?

Наш старый/существующая практика ссылаться на файлы с помощью Server.MapPath():

String filename = HttpContext.Current.Server.MapPath("/common/template_1.txt"); 

Однако это не удается во время тестирования. Тест-бегун не имеет HttpContext.

Есть ли механизм для ссылки на /common/template_1.txt, который будет работать с или без HttpContext? Или нам нужно изготовить HttpContext?


Если нам нужно повторить Содержимое элементов для теста, это нормально (хотя и не идеально).

+0

http://stackoverflow.com/questions/9624242/setting-the-httpcontext-current-session-in-unit-test – Donal

+0

@Donal Спасибо за ссылку. Мы можем подделать «HttpContext», если это абсолютно необходимо. Но мы делаем большие успехи в абстрагировании наших других зависимостей HttpContext. Если есть разумный способ работать с «MapPath()» специально, это то, что я ищу. – svidgen

+0

Тестирование, которое включает внешние источники (db, файлы ...), должно выполняться с использованием mocks или stub. – walther

ответ

0

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

Другим решением является вызов вашего телефона HttpContext.Current.Server.MapPath за пределами класса, который вы вызываете в своем тесте. Затем возьмите имя файла (или содержимое файла) в качестве аргумента метода или введите его через конструктор класса. Затем вы сможете отправить поддельное имя файла в своем тесте.

Если вам необходимо использовать содержимое файла в ваших тестах, то хорошим решением может быть дублировать файл в качестве внедренного ресурса в соответствии с предложением @MikeMiller, а затем вы можете прочитать его следующим кодом:

private string GetEmbeddedFileResource() 
{ 
    var assembly = Assembly.GetExecutingAssembly(); 
    const string resourceName = "TestProjectNamespace.TestFileFolder.template_1.txt"; 

    var stream = assembly.GetManifestResourceStream(resourceName); 
    if (stream == null) return string.Empty; 
    using (var reader = new StreamReader(stream)) 
    { 
     var result = reader.ReadToEnd(); 
     return result; 
    } 
}