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

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

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

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

最佳答案

为什么要在ASP.NET MVC应用程序中拥有依赖HostingEnvironment.MapPath的代码,在其中您可以访问诸如HttpServerUtilityBase之类的对象,从而可以实现此目的,并且可以轻松对其进行模拟和单元测试?

让我们举个例子:一个 Controller Action ,它使用我们要进行单元测试的抽象Server类:

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

现在,有很多方法可以对该 Controller Action 进行单元测试。我个人喜欢使用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);
}

关于asp.net - 如何对使用HostingEnvironment.MapPath的代码进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740498/

相关文章:

python - 如何为文本解析器编写单元测试?

c# - 使用 NetBios 名称的受信任域的 PrincipalContext.ValidateCredentials 速度慢

asp.net - SignalR和浏览器连接限制

asp.net-mvc-3 - T4 中的 FOR..NEXT 循环 (VB)

sql - postgres - 以编程方式将 1gb 模拟数据加载到表中的方法

unit-testing - 如何对 Go Gin 处理程序函数进行单元测试?

c# - C#代码隐藏中的多个不同的SQL更新命令

asp.net - 升级到Visual Studio 2010后找不到System.Web.Script.Service命名空间错误

asp.net - 如何从 View 中获取表数据是 asp.net mvc 4

asp.net-mvc-3 - Razor -如何将内容渲染为变量