Yan*_*ans 10 c# asp.net-mvc nunit unit-testing moq
我正在研究ASP.NET MVC 4项目(.NET框架4),我想知道如何正确地单元测试自定义AuthorizeAttribute(我使用NUnit和Moq).
我超越了2种方法:AuthorizeCore(HttpContextBase httpContext)和HandleUnauthorizedRequest(AuthorizationContext filterContext).正如你所看到的,这些方法分别期望HttpContextBase和AuthorizationContext,但我不知道如何模拟这些.
这是我得到的:
[Test]
public void HandleUnauthorizedRequest_UnexistingMaster_RedirectsToCommonNoMaster()
{
// Arrange
var httpContext = new Mock<HttpContextBase>();
var winIdentity = new Mock<IIdentity>();
winIdentity.Setup(i => i.IsAuthenticated).Returns(() => true);
winIdentity.Setup(i => i.Name).Returns(() => "WHEEEE");
httpContext.SetupGet(c => c.User).Returns(() => new ImdPrincipal(winIdentity.Object)); // This is my implementation of IIdentity
var requestBase = new Mock<HttpRequestBase>();
var headers = new NameValueCollection
{
{"Special-Header-Name", "false"}
};
requestBase.Setup(x => x.Headers).Returns(headers);
requestBase.Setup(x => x.HttpMethod).Returns("GET");
requestBase.Setup(x => x.Url).Returns(new Uri("http://localhost/"));
requestBase.Setup(x => x.RawUrl).Returns("~/Maintenance/UnExistingMaster");
requestBase.Setup(x => x.AppRelativeCurrentExecutionFilePath).Returns(() => "~/Maintenance/UnExistingMaster");
requestBase.Setup(x => x.IsAuthenticated).Returns(() => true);
httpContext.Setup(x => x.Request).Returns(requestBase.Object);
var controller = new Mock<ControllerBase>();
var actionDescriptor = new Mock<ActionDescriptor>();
var controllerContext = new ControllerContext(httpContext.Object, new RouteData(), controller.Object);
// Act
var masterAttr = new ImdMasterAuthorizeAttribute();
var filterContext = new AuthorizationContext(controllerContext, actionDescriptor.Object);
masterAttr.OnAuthorization(filterContext);
// Assert
Assert.AreEqual("", filterContext.HttpContext.Response);
}
Run Code Online (Sandbox Code Playgroud)
在线:masterAttr.OnAuthorization(filterContext);a NullReferenceException被抛出.我认为它与我们尚未嘲笑的上下文中的值有关.
任何帮助是极大的赞赏.
提前致谢.
真诚的,Yanik Ceulemans
没有属性的代码,人们只能猜测.但是要开始调查,你可以创建你的模拟MockBehavior.Strict.这样,当没有先前的设置调用mock上的方法或属性时,Moq将抛出异常.该异常将具有方法/属性的名称:
var httpContext = new Mock<HttpContextBase>(MockBehavior.Strict);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7150 次 |
| 最近记录: |