How to unit test code that uses HostingEnvironment.MapPath

前端 未结 5 819
走了就别回头了
走了就别回头了 2020-12-31 01:46

I have some code that uses HostingEnvironment.MapPath which I would like to unit test.

How can I setup HostingEnvironment so that it retur

相关标签:
5条回答
  • 2020-12-31 02:21

    As i faced same issue i changed my code bit. From

    strhtmlTemplate = File.ReadAllText(System.Web.Hosting.HostingEnvironment.MapPath(Lgetfilepath.CVal));
    

    To

    strhtmlTemplate = File.ReadAllText(HttpContextFactory.Current.Server.MapPath(Lgetfilepath.CVal));
    

    For Unit test

    public HttpContextBase mockHttpContextBase()
            {
                var moqContext = new Mock<HttpContextBase>();
                var moqRequest = new Mock<HttpRequestBase>();
                var moqServer = new Mock<HttpServerUtilityBase>();
                var moqPath = new Mock<ConfigurationBase>();
                moqContext.Setup(x => x.Request).Returns(moqRequest.Object);
                moqContext.Setup(x => x.Server.MapPath(@"~\Data\xxxxxxx")).Returns(Environment.CurrentDirectory+@"\xxxxxx");                
                setupApplication(moqContext);
    
                return moqContext.Object;
            }
    

    Now we while Writing TestClass you need to refer above method to mock. Hope it will helpful for your TestCases.

    MockDataUT mockData = new MockDataUT();
    var mockRequestContext = new HttpRequestContext();
    HttpContextFactory.SetCurrentContext(mockData.mockHttpContextBase());
    
    0 讨论(0)
  • 2020-12-31 02:21

    Just use this code..

    Make a new folder name Reference in root directory and added your file inside this folder.

    Use this

    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 讨论(0)
  • 2020-12-31 02:29

    Why would you have a code that depends on HostingEnvironment.MapPath in an ASP.NET MVC application where you have access to objects like HttpServerUtilityBase which allow you to achieve this and which can be easily mocked and unit tested?

    Let's take an example: a controller action which uses the abstract Server class that we want to unit test:

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

    Now, there are many ways to unit test this controller action. Personally I like using the MVcContrib.TestHelper.

    But let's see how we can do this using a mocking framework out-of-the-box. I use Rhino Mocks for this example:

    [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);
    }
    
    0 讨论(0)
  • 2020-12-31 02:35

    Well I was writing a test today for code that I don't control and they used

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

    so here is a C# reflection hack to set that value

    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 讨论(0)
  • 2020-12-31 02:45

    It will depend on what mocking or isolation framework you are using. You might want to look into either a) creating a wrapper type around the static property that can be mocked, or b) using a framework which can mock static properties - e.g. Moles or Typemock Isolator

    0 讨论(0)
提交回复
热议问题