Как выполнить модульное тестирование кода, который использует HostingEnvironment.MapPath - PullRequest
20 голосов
/ 05 января 2012

У меня есть код, который использует HostingEnvironment.MapPath, который я хотел бы для модульного тестирования.

Как настроить HostingEnvironment, чтобы он возвращал путь, а не null в моем проекте модульного теста (mstest)?

Ответы [ 4 ]

16 голосов
/ 05 января 2012

Зачем вам нужен код, который зависит от HostingEnvironment.MapPath в приложении ASP.NET MVC, где у вас есть доступ к объектам, таким как HttpServerUtilityBase, которые позволяют вам достичь этого и которые можно легко смоделировать и протестировать на модуле?1002 * Давайте рассмотрим пример: действие контроллера, использующее абстрактный класс Server, который мы хотим выполнить модульным тестом:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var file = Server.MapPath("~/App_Data/foo.txt");
        return View((object)file);
    }
}

Теперь существует много способов модульного тестирования этого действия контроллера.Лично мне нравится использовать MVcContrib.TestHelper .

Но давайте посмотрим, как мы можем сделать это, используя готовый фальшивый фреймворк.Я использую Rhino Mocks для этого примера:

[TestMethod]
public void Index_Action_Should_Calculate_And_Pass_The_Physical_Path_Of_Foo_As_View_Model()
{
    // arrange
    var sut = new HomeController();
    var server = MockRepository.GeneratePartialMock<HttpServerUtilityBase>();
    var context = MockRepository.GeneratePartialMock<HttpContextBase>();
    context.Expect(x => x.Server).Return(server);
    var expected = @"c:\work\App_Data\foo.txt";
    server.Expect(x => x.MapPath("~/App_Data/foo.txt")).Return(expected);
    var requestContext = new RequestContext(context, new RouteData());
    sut.ControllerContext = new ControllerContext(requestContext, sut);

    // act
    var actual = sut.Index();

    // assert
    var viewResult = actual as ViewResult;
    Assert.AreEqual(viewResult.Model, expected);
}
1 голос
/ 07 марта 2016

Что ж, сегодня я писал тест для кода, который я не контролирую, и они использовали

    private static String GetApplicationPath()
    {
        return HostingEnvironment.ApplicationVirtualPath.TrimEnd('/');
    }

, так что здесь есть взлом C # для установки этого значения

var path =  "/aaaa/bb";

HostingEnvironment hostingEnvironment;
if (HostingEnvironment.IsHosted.isFalse())
    new HostingEnvironment();

hostingEnvironment = (HostingEnvironment)typeof(HostingEnvironment).fieldValue("_theHostingEnvironment");

var virtualPath = "System.Web".assembly()
                   .type("VirtualPath").ctor();

virtualPath.field("_virtualPath", path);
//return virtualPath.prop("VirtualPathString");                
//return virtualPath.prop("VirtualPathStringNoTrailingSlash");                 

hostingEnvironment.field("_appVirtualPath", virtualPath);
//hostingEnvironment.field("_appVirtualPath") == virtualPath;

return HostingEnvironment.ApplicationVirtualPath == path;       

//using  System.Web.Hosting
0 голосов
/ 29 апреля 2013

Просто используйте этот код ..

Создайте новое имя папки Ссылка в корневом каталоге и добавьте свой файл в эту папку.

Используйте это

public static XElement GetFile()
{
    HttpContext.Current = new HttpContext(new HttpRequest("", "http://www.google.com", ""), new HttpResponse(new StringWriter()));

    var doc = new XmlDocument();
    var file = HttpContext.Current.Server.MapPath("\\") + "abc.xml";
    doc.Load(file);
    var e = XElement.Load(new XmlNodeReader(doc));
    return e;
}
0 голосов
/ 05 января 2012

Это будет зависеть от того, какую среду насмешки или изоляции вы используете. Возможно, вы захотите изучить а) создание типа оболочки вокруг статического свойства, которое может быть смоделировано, или б) использование инфраструктуры, которая может имитировать статические свойства - например, Родинки или Изолятор для пробок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...