首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何对使用HostingEnvironment.MapPath的代码进行单元测试

如何对使用HostingEnvironment.MapPath的代码进行单元测试
EN

Stack Overflow用户
提问于 2012-01-05 17:53:44
回答 4查看 13.8K关注 0票数 22

我有一些使用HostingEnvironment.MapPath的代码,我想对它们进行单元测试。

如何在我的单元测试(mstest)项目中设置HostingEnvironment,使其返回路径而不是null

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-05 20:09:24

在ASP.NET MVC应用程序中,你为什么要有一个依赖于HostingEnvironment.MapPath的代码,在这个应用程序中,你可以访问像HttpServerUtilityBase这样的对象,这些对象可以让你实现这一点,并且可以很容易地模拟和单元测试?

让我们举个例子:一个控制器操作,它使用了我们想要进行单元测试的抽象Server类:

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

现在,有很多方法可以对这个控制器操作进行单元测试。就我个人而言,我喜欢使用MVcContrib.TestHelper

但让我们看看如何使用开箱即用的mocking框架来做到这一点。我在这个例子中使用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);
}
票数 14
EN

Stack Overflow用户

发布于 2016-03-07 22:32:11

我今天写了一个我不能控制的代码的测试,他们用了

    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
票数 3
EN

Stack Overflow用户

发布于 2012-01-05 18:05:48

这将取决于您所使用的模拟或隔离框架。您可能希望这样做: a)围绕可以模拟的静态属性创建包装器类型,或者b)使用可以模拟静态属性的框架-例如MolesTypemock Isolator

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8740498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档