当前位置:  开发笔记 > 后端 > 正文

单元测试代码调用VirtualPathUtility.ToAbsolute

如何解决《单元测试代码调用VirtualPathUtility.ToAbsolute》经验,为你挑选了2个好方法。

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

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



1> Jon Kerr..:

我们已经过了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:问题标题的方式,谷歌总是将其作为热门回报.因此,即兴发布答案是一个好主意.对不起,但我认为我不同意暗示推理.这不是公认的答案,这就足够了.

2> tvanfosson..:

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

使用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.Expect( v => v.ToAbsolute( path) ).Return( expected );

     MyClass class = new MyClass( vpu );

     string actual = class.SomeMethod( path );

     Assert.AreEqual( expected, actual );

     vpu.VerifyAllExpectations();
}

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有