考虑 .NET 程序集中的一个方法:
public static string GetSecurityContextUserName()
{
//extract the username from request
string sUser = HttpContext.Current.User.Identity.Name;
//everything after the domain
sUser = sUser.Substring(sUser.IndexOf("\\") + 1).ToLower();
return sUser;
}
我想使用 Moq 框架从单元测试中调用此方法。该程序集是 Webforms 解决方案的一部分。单元测试看起来像这样,但我缺少起订量代码。
//arrange
string ADAccount = "BUGSBUNNY";
string fullADName = "LOONEYTUNES\BUGSBUNNY";
//act
//need to mock up the HttpContext here somehow -- using Moq.
string foundUserName = MyIdentityBL.GetSecurityContextUserName();
//assert
Assert.AreEqual(foundUserName, ADAccount, true, "Should have been the same User Identity.");
Question:
- 如何使用 Moq 来安排具有“MyDomain\MyUser”等值的假 HttpContext 对象?
- 我如何将该假与我对静态方法的调用关联起来
MyIdentityBL.GetSecurityContextUserName()
?
- 您对如何改进此代码/架构有什么建议吗?
由于这个确切原因,Webforms 是出了名的不可测试 - 许多代码可以依赖于 ASP.NET 管道中的静态类。
为了使用 Moq 进行测试,您需要重构您的GetSecurityContextUserName()
使用依赖注入的方法HttpContextBase
object.
HttpContextWrapper
驻留在System.Web.Abstractions
,随 .Net 3.5 一起提供。它是一个包装器HttpContext
类,并扩展HttpContextBase
,你可以构建一个HttpContextWrapper
像这样:
var wrapper = new HttpContextWrapper(HttpContext.Current);
更好的是,您可以模拟 HttpContextBase 并使用 Moq 设置您对它的期望。包括登录的用户等。
var mockContext = new Mock<HttpContextBase>();
完成此操作后,您可以调用GetSecurityContextUserName(mockContext.Object)
,并且您的应用程序与静态 WebForms HttpContext 的耦合要少得多。如果您要进行大量依赖于模拟上下文的测试,我强烈建议看一下 Scott Hanselman 的 MvcMockHelpers 类 http://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx,它有一个与 Moq 一起使用的版本。它可以方便地处理许多必要的设置。尽管有这个名称,但您不需要使用 MVC 来完成它 - 当我可以重构它们以使用时,我成功地将它与 Webforms 应用程序一起使用HttpContextBase
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)