2013-10-24 3 views
9

У меня есть метод. которые извлекают документ с жесткого диска. Я не могу проверить это на модульном тестировании. Он всегда выдает исключение недействительным пустым путём или чем-то еще. Как проверить это. Я временно создал сеанс для модульного теста. Но я не могу для этого Server.MapPath. Как это сделать ?Тестирование модуля для Server.MapPath

+0

Вам нужно издеваться объект сервера, [этот вопрос] (http://stackoverflow.com/questions/17332219/mock-server-in-a -controller) говорит об этом, хотя это для MVC, вы все равно должны использовать одну и ту же логику. – Liam

+1

Вы не можете. Статику довольно сложно насмехаться. Подумайте об изменении исходного кода, которому требуется значение Server.MapPath, чтобы принять делегат Action, который инкапсулирует Server.MapPath. Тогда в ваших тестах вы можете издеваться над этим. –

+0

Да, как @MarvinSmit говорит, вам нужно перейти к шаблону инъекции зависимостей, чтобы достичь этого – Liam

ответ

30

Вы можете использовать инъекции зависимостях и абстракцию над Server.MapPath

public interface IPathProvider 
{ 
    string MapPath(string path); 
} 

и реализация производства будет:

public class ServerPathProvider : IPathProvider 
{ 
    public string MapPath(string path) 
    { 
      return HttpContext.Current.Server.MapPath(path); 
    } 
} 

Во время тестирования один:

public class TestPathProvider : IPathProvider 
{ 
    public string MapPath(string path) 
    { 
     return Path.Combine(@"C:\project\",path); 
    } 
} 
+8

* cough * Path.Combine вместо + –

+0

Действительно, спасибо, что указали это.Код изменен –

+0

Спасибо, очень хороший совет. –

7

Если вам нужно проверьте устаревший код, который вы не можете или не хотите изменять, вы можете попробовать FakeHttpContext.

Вот как это работает:

var expectedPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "path"); 
using (new FakeHttpContext()) 
{ 
    var mappedPath = Http.Context.Current.Server.MapPath("path"); 
    Assert.Equal(expectedPath, mappedPath); 
} 
+1

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/11017158) – MikkaRin

+0

Спасибо, я обновил ответ, как вы рекомендовали. – vAD

+0

Как можно установить базовый MapPath * с помощью FakeHttpContext? – Hannobo

Смежные вопросы