【发布时间】:2010-10-13 21:33:11
【问题描述】:
我正在尝试对调用VirtualPathUtility.ToAbsolute 的一些代码进行单元测试。
VS 2008 提供的单元测试工具可以做到这一点吗?如果没有,是否可以使用更高版本的 Visual Studio?
【问题讨论】:
标签: asp.net .net unit-testing
我正在尝试对调用VirtualPathUtility.ToAbsolute 的一些代码进行单元测试。
VS 2008 提供的单元测试工具可以做到这一点吗?如果没有,是否可以使用更高版本的 Visual Studio?
【问题讨论】:
标签: asp.net .net unit-testing
我们已经过了 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);
}
【讨论】:
使用 Microsoft Fakes,我们可以轻松伪造 VirtualPathUtility ToAbsolute 方法。
使用以下代码
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 );
}
}
}
【讨论】:
静态类和方法在单元测试中真的很难使用(这是我尽量避免使用它们的原因之一)。在这种情况下,我可能会围绕静态类开发一个包装器,只包含我使用的那些方法。然后我会用我的包装类代替真正的类。包装类将被构造成易于模拟。
使用 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();
}
【讨论】: