我有一些使用HostingEnvironment.MapPath
的代码,我想对它们进行单元测试。
如何在我的单元测试(mstest)项目中设置HostingEnvironment
,使其返回路径而不是null
?
发布于 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);
}
发布于 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
发布于 2012-01-05 18:05:48
这将取决于您所使用的模拟或隔离框架。您可能希望这样做: a)围绕可以模拟的静态属性创建包装器类型,或者b)使用可以模拟静态属性的框架-例如Moles或Typemock Isolator
https://stackoverflow.com/questions/8740498
复制相似问题