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

原文 标签 asp.net asp.net-mvc-3 unit-testing

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

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

最佳答案

为什么要在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

但是,让我们看看如何使用现成的模拟框架来做到这一点。在此示例中,我使用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);
}

相关文章:

c# - MVC3中的多种形式

javascript - onkeydown ='return(window.event.keyCode不允许通过鼠标单击进行选择输入

javascript - 滚动表格时,使表格标题保留在屏幕上(下面的想法)

asp.net - 共享主机中的“The transaction log for database is full due to ' LOG_BACKUP '”

c# - ASP.NET MVC(3)将POST值绑定(bind)到“对象”类型会使该对象成为System.String [],为什么?

c# - (何时)使用FluentAssertions是一个好主意?

javascript - 当前上下文值未从用户控件呈现到.aspx页

c# - 在Asp.net MVC 3中使用ajax发送json对象数组以进行操作

c++ - 从Visual Studio 2010运行BOOST单元测试

java - 如何使用Mockito @InjectMocks将HttpServletRequest注入(inject)ContainerRequestFilter