代码之家  ›  专栏  ›  技术社区  ›  ilivewithian

调用virtualpathutility.toabsolute的单元测试代码

  •  12
  • ilivewithian  · 技术社区  · 16 年前

    我正在尝试对一些调用的代码进行单元测试 VirtualPathUtility.ToAbsolute .

    与2008年相比,提供的单元测试工具是否可能做到这一点?如果没有,是否可以使用更高版本的Visual Studio?

    3 回复  |  直到 8 年前
        1
  •  7
  •   tvanfosson    16 年前

    静态类和方法确实很难在单元测试中使用(这也是我试图避免使用它们的原因之一)。在这种情况下,我可能会围绕静态类开发一个包装器,只包含我使用的那些方法。然后我将使用包装类代替真正的类。包装器类将被构造为便于模拟。

    使用犀牛模型的例子。注意,它使用依赖注入为被测试类提供包装器的副本。如果提供的包装为空,则创建一个。

    public class MyClass
    {
         private VPU_Wrapper VPU { get; set; }
    
         public MyClass() : this(null) {}
    
         public MyClass( VPU_Wrapper vpu )
         {
             this.VPU = vpu ?? new VPU_Wrapper();
         }
    
         public string SomeMethod( string path )
         {
             return this.VPU.ToAbsolute( path );
         }
    }
    
    public class VPU_Wrapper
    {
        public virtual string ToAbsolute( string path )
        {
             return VirtualPathUtility.ToAbsolute( path );
        }
    }
    
    [TestMethod]
    public void SomeTest()
    {
         string path = "~/path";
         string expected = "/app/path";
    
         var vpu = MockRepository.GenerateMock<VPU_Wrapper>();
         vpu.Expect( v => v.ToAbsolute( path) ).Return( expected );
    
         MyClass class = new MyClass( vpu );
    
         string actual = class.SomeMethod( path );
    
         Assert.AreEqual( expected, actual );
    
         vpu.VerifyAllExpectations();
    }
    
        2
  •  17
  •   Heinzi    8 年前

    我们已经远远超过了2008年,但对于任何仍在努力解决这个问题的人,我已经找到了一个解决方案: http://forums.asp.net/t/995143.aspx?Mocking+HTTPContext+object .

    在测试初始化中使用以下代码重写默认的AppDomain值。(virutalpathutility静态方法将使用新值。)

    [TestInitialize]
    public void Initialize()
    {
        // Fake out env for VirtualPathUtility.ToAbsolute(..)
        string path = AppDomain.CurrentDomain.BaseDirectory; 
        const string virtualDir = "/";
        AppDomain.CurrentDomain.SetData(".appDomain", "*");
        AppDomain.CurrentDomain.SetData(".appPath", path);
        AppDomain.CurrentDomain.SetData(".appVPath", virtualDir);
        AppDomain.CurrentDomain.SetData(".hostingVirtualPath", virtualDir);
        AppDomain.CurrentDomain.SetData(".hostingInstallDir", HttpRuntime.AspInstallDirectory);
        TextWriter tw = new StringWriter();
        HttpWorkerRequest wr = new SimpleWorkerRequest("default.aspx", "", tw);
        HttpContext.Current = new HttpContext(wr);
    }
    
        3
  •  3
  •   Siva    10 年前

    使用Microsoft Fake,我们可以轻松地将virtualpathutility伪造为solute方法。

    1. 浏览参考资料中的system.web右键单击添加Fakes程序集。

    使用以下代码

    using Microsoft.QualityTools.Testing.Fakes;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System.Web.Fakes;
    
     public class TestCode
        {
            [TestMethod]
            public void TestSummaryTabLinks()
            {
                using (ShimsContext.Create())
                {
                    //Fake VirtualPathUtility ToAbsolute method to Work properly in case of Unit Test Project
                    //For Finding Relative url.
                    ShimVirtualPathUtility.ToAbsoluteString = (string s) => { return s; };
    
                    MyClass class = new MyClass( vpu );
    
                    string actual = class.SomeMethod( path );
    
                    Assert.AreEqual( expected, actual );
    
                }
          }
    
    }