Asp.net

呼叫 VirtualPathUtility.ToAbsolute 的單元測試程式碼

  • April 21, 2017

我正在嘗試對一些呼叫VirtualPathUtility.ToAbsolute.

VS 2008 提供的單元測試工具可以做到這一點嗎?如果沒有,是否可以使用更高版本的 Visual Studio?

靜態類和方法在單元測試中真的很難使用(這是我試圖避免它們的原因之一)。在這種情況下,我可能會圍繞靜態類開發一個包裝器,只包含我使用的那些方法。然後我會用我的包裝類代替真正的類。包裝類將被構造,以便於模擬。

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

我們已經過了 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);
}

引用自:https://stackoverflow.com/questions/655134