Tre*_*oll 38 asp.net asp.net-mvc mocking
我需要为ASP.NET MVC 2.0网站创建单元测试.该站点使用Windows身份验证.
我一直在阅读有必要为处理HttpContext的代码模拟HTTP上下文.我觉得我也开始处理DI模式了.(为类提供类型为IRepository的属性,然后在实例化控制器时传入Repository对象.)
但是,我不明白的是通过User.Identity模拟Windows Principal对象的正确方法.这是HttpContext的一部分吗?
是否有任何正文链接到展示此内容的文章(或推荐书籍)?
谢谢,
特雷卡罗尔
Joh*_*son 31
我已经使用IoC来取消一些成功.我首先定义了一个类来表示当前登录的用户:
public class CurrentUser
{
public CurrentUser(IIdentity identity)
{
IsAuthenticated = identity.IsAuthenticated;
DisplayName = identity.Name;
var formsIdentity = identity as FormsIdentity;
if (formsIdentity != null)
{
UserID = int.Parse(formsIdentity.Ticket.UserData);
}
}
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public int UserID { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
它需要IIdentity在构造函数中设置其值.对于单元测试,您可以添加另一个构造函数以允许绕过IIdentity依赖项.
然后我使用Ninject(选择你喜欢的IoC容器,无关紧要),并为此创建一个绑定IIdentity:
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
Run Code Online (Sandbox Code Playgroud)
然后,在我的控制器内部,我在构造函数中声明了依赖项:
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
Run Code Online (Sandbox Code Playgroud)
IoC容器看到它HomeController接受一个CurrentUser对象,CurrentUser构造函数接受一个IIdentity.它将自动解决依赖关系,瞧!您的控制器可以知道当前登录用户是谁.对于FormsAuthentication,它似乎对我很有用.您可以将此示例调整为Windows身份验证.
Mov*_*GP0 19
我不知道MVC 2.0,但在较新的版本中你可以模拟ControllerContext:
// create mock principal
var mocks = new MockRepository(MockBehavior.Default);
Mock<IPrincipal> mockPrincipal = mocks.Create<IPrincipal>();
mockPrincipal.SetupGet(p => p.Identity.Name).Returns(userName);
mockPrincipal.Setup(p => p.IsInRole("User")).Returns(true);
// create mock controller context
var mockContext = new Mock<ControllerContext>();
mockContext.SetupGet(p => p.HttpContext.User).Returns(mockPrincipal.Object);
mockContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);
// create controller
var controller = new MvcController() { ControllerContext = mock.Object };
Run Code Online (Sandbox Code Playgroud)
另请参阅如何对依赖于c#中的身份验证的MVC控制器操作进行单元测试?
在MVC4上模拟用户名和SID的示例. 应测试以下操作中的用户名和SID(Windows身份验证):
[Authorize]
public class UserController : Controller
{
public ActionResult Index()
{
// get Username
ViewBag.Username = User.Identity.Name;
// get SID
var lIdentity = HttpContext.User.Identity as WindowsIdentity;
ViewBag.Sid = lIdentity.User.ToString();
return View();
}
}
Run Code Online (Sandbox Code Playgroud)
我使用Moq和Visual Studio测试工具.测试实施如下:
[TestMethod]
public void IndexTest()
{
// Arrange
var myController = new UserController();
var contextMock = new Mock<ControllerContext>();
var httpContextMock = new Mock<HttpContextBase>();
var lWindowsIdentity = new WindowsIdentity("Administrator");
httpContextMock.Setup(x => x.User).Returns(new WindowsPrincipal(lWindowsIdentity));
contextMock.Setup(ctx => ctx.HttpContext).Returns(httpContextMock.Object);
myController.ControllerContext = contextMock.Object;
// Act
var lResult = myController.Index() as ViewResult;
// Assert
Assert.IsTrue(lResult.ViewBag.Username == "Administrator");
Assert.IsTrue(lResult.ViewBag.Sid == "Any SID Pattern");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19459 次 |
| 最近记录: |