【问题标题】:Unit Testing Code that calls VirtualPathUtility.ToAbsolute调用 VirtualPathUtility.ToAbsolute 的单元测试代码
【发布时间】:2010-10-13 21:33:11
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net .net unit-testing


    【解决方案1】:

    我们已经过了 VS 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);
    }
    

    【讨论】:

    • 我一开始就注意到了。每次我对这个问题进行搜索时,这篇文章都会不断出现,所以我认为它与当前的工具相关。
    • 我们可以在这里以问答方式分享知识。特别是,您可以针对 2013 工具提出单独的问题,并提供上述内容作为您的答案。我通常不建议Stack Overflow 的新用户这样做。我不确定你可以用“1”代表做到这一点。但这样做可能是合适的。
    • +1:问题的标题方式,Google 将始终将此作为热门问题返回。因此,即兴回答是个好主意。对不起,但我认为我不能同意反对票的推理。这不是公认的答案,这就足够了。
    • @JohnSaunders:我冒昧地将问题“概括”到较新版本的 Visual Studio。我认为它现在对公众更有用(特别是考虑到它在 Google 上的高排名)。
    • @Heinzi 我试图删除我的反对票,但在您编辑答案之前它不会让我这样做。
    【解决方案2】:

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

    1. 在 References 中浏览 System.Web > 右键单击​​ > 添加 Fakes Assembly。

    使用以下代码

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

    【讨论】:

    • 这不是问题的答案——问题是明确的关于 VS2008,它没有假货。
    【解决方案3】:

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

    使用 RhinoMocks 的示例(有点)。请注意,它使用依赖注入为被测类提供包装器的副本。如果提供的包装器为空,它会创建一个。

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

    【讨论】:

    • +1 用于包装它,这表示我更喜欢为我将模拟的东西显式声明一个接口
    • @Freddy -- 我也经常使用界面。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2018-12-15
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多