如何进行单元测试以测试检查请求标头的方法?

Dre*_*edj 12 c# asp.net-mvc nunit unit-testing moq

我对单元测试非常非常新,我正在尝试为一个非常简单的方法编写测试:

public class myClass : RequireHttpsAttribute
{
    public override void OnAuthorization(AuthoizationContext filterContext)
    {
        var request = filterContext.HttpContext.Request;
        var header = Convert.ToBoolean(request.Headers["Special-Header-Name"]);

        if (!(header || request.IsSecureConnection))
        {
            HandleNonHttpsRequest(filterContext);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个方法继承自RequireHttpsAttribute,检查页面是否存在某个标题,如果它丢失或为假,并且页面不安全,那么它将调用HandleNonHttpsRequest,否则它什么都不做.

我们正在使用Moq和Nunit进行测试.我找到了一些资源来帮助用Moq构建一个fakeHttpContext,但说实话,我不确定如何使用它或在我的单元测试中去哪里以确保假的HttpContexts是或不是导致该HandleNonHttpsRequest方法调用.

我真的很感激这个问题的任何指导.

Dar*_*rov 20

// arrange
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var headers = new NameValueCollection
{
    { "Special-Header-Name", "false" }
};
request.Setup(x => x.Headers).Returns(headers);
request.Setup(x => x.HttpMethod).Returns("GET");
request.Setup(x => x.Url).Returns(new Uri("http://www.example.com"));
request.Setup(x => x.RawUrl).Returns("/home/index");
context.Setup(x => x.Request).Returns(request.Object);
var controller = new Mock<ControllerBase>();

var actionDescriptor = new Mock<ActionDescriptor>();
var controllerContext = new ControllerContext(context.Object, new RouteData(), controller.Object);
var filterContext = new AuthorizationContext(controllerContext, actionDescriptor.Object);
var sut = new myClass();

// act
sut.OnAuthorization(filterContext);

// assert
Assert.IsInstanceOfType(filterContext.Result, typeof(RedirectResult));
var redirectResult = (RedirectResult)filterContext.Result;
Assert.AreEqual("https://www.example.com/home/index", redirectResult.Url);
Run Code Online (Sandbox Code Playgroud)