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