Поблочное тестирование C#: Тестирование метода, который использует MapPath

Для понимания, что делает ls Вы могли взять глупца в источнике OpenSolaris: https://hg.java.net/hg/solaris~on-src/file/tip/usr/src/cmd/ls/ls.c.

, Если thatВґs подавляющий, на Солярисе Вы начинаете при помощи связки смотреть на системные вызовы, которые ls делает для понимания то, что это делает. Используя связку, попробуйте:

-afl-o ls.out/bin/ls

связки тогда смотрит на вывод в ls.out

, я полагаю, что трассировка является эквивалентом для связывания в Linux.

19
задан Community 23 May 2017 в 10:32
поделиться

4 ответа

Я бы абстрагировал "поставщик имени файла" в класс, который просто возвращает местоположение, тогда вы можете издеваться над ним намного, намного проще.

public class PathProvider
{
    public virtual string GetPath()
    {
        return HttpContext.Current.Server.MapPath("App_Data/ErrorCodes.xml");
    }
}

Затем вы можете использовать класс PathProvider напрямую ...

PathProvider pathProvider = new PathProvider();
XDocument xdoc = XDocument.Load(pathProvider.GetPath());

Или смоделируйте это в своих тестах:

PathProvider pathProvider = new MockPathProvider(); // using a mocking framework
XDocument xdoc = XDocument.Load(pathProvider.GetPath());
15
ответ дан 30 November 2019 в 04:16
поделиться

После тщательного поиска в Google и некоторой помощи коллеги мы уже нашли простое решение встроенный в .net

Над модульными тестами, которые обращаются к процессу проверки, я добавил:

 [TestMethod()]
 [HostType("ASP.NET")]
 [UrlToTest("http://localhost:###/upload_file.aspx")]
 [AspNetDevelopmentServerHost("Path To Web Application", "Path To Web Root")]

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

11
ответ дан 30 November 2019 в 04:16
поделиться

Попробуйте использовать Rhino Mocks или альтернативный фреймворк для имитации httpContext (или других зависимых объектов) Или вы можете написать свои собственные фиктивные объекты. Или напишите класс MapPathWrapper, унаследованный от класса MapPathWrapperBase для вашей реальной среды, а затем для своих модульных тестов создайте объект MockMapPathWrapper.

Должно быть много примеров для издевательства над SO.

Вот один, который я спросил:

Как использовать Rhino Mocks для имитации HttpContext.Application

ОБНОВЛЕНИЕ У меня есть опыт делать это только с Asp.Net MVC, с веб-формами, которые я представляю, было бы намного сложнее из-за отсутствия класса HttpContextBase.

1
ответ дан 30 November 2019 в 04:16
поделиться

Я бы извлек методы, которые принимают ваши зависимости в качестве аргументов:

public void Validate(HttpContext context)
{
    ValidatePath(context.Server.MapPath("App_Data/ErrorCodes.xml"));
}

public void ValidatePath(string path)
{
    XDocument xdoc = XDocument.Load(path);
    ValidateDocument(xdoc);
}

public void ValidateDocument(XDocument xdoc)
{
    // Original code
}

Затем вы можете протестировать различные методы независимо. Например, проверка того, как ValidatePath () обрабатывает отсутствующий файл.

1
ответ дан 30 November 2019 в 04:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: