Asp.net
呼叫 VirtualPathUtility.ToAbsolute 的單元測試程式碼
我正在嘗試對一些呼叫
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); }