我正在尝试对一些调用的代码进行单元测试VirtualPathUtility.ToAbsolute
.
使用VS 2008提供的单元测试工具可以实现这一点吗?如果没有,是否可以使用更高版本的Visual Studio?
我们已经过了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); }
静态类和方法在单元测试中很难处理(这是我试图避免它们的一个原因).在这种情况下,我可能会围绕静态类开发一个包装器,它只包含我使用的那些方法.然后我会用我的包装类代替真正的类.将构造包装器类,以便易于模拟.
使用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(); }