单元测试代码调用VirtualPathUtility.ToAbsolute

时间:2009-03-17 17:00:59

标签: asp.net .net unit-testing

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

VS 2008提供的单元测试工具是否可以实现?如果没有,是否可以使用更高版本的Visual Studio?

3 个答案:

答案 0 :(得分:18)

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

在test init中使用以下代码覆盖默认的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);
}

答案 1 :(得分:8)

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

使用RhinoMocks的示例(某种程度)。请注意,它使用依赖注入来为测试中的类提供包装器的副本。如果提供的包装器为null,则会创建一个。

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 :(得分:3)

使用Microsoft Fakes我们可以轻松伪造VirtualPathUtility ToAbsolute方法。

  1. 在参考文献中浏览System.Web&gt;右键单击&gt;添加假装大会。
  2. 使用以下代码

    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 );
    
                }
          }
    
    }