如何使一个单元测试来测试检查请求头的方法? [英] How do I make a unit test to test a method that checks request headers?

查看:765
本文介绍了如何使一个单元测试来测试检查请求头的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我非常,非常新的单元测试,我试图写一个pretty简单的方法测试:

 公共MyClass类:RequireHttpsAttribute
{
    公共覆盖无效OnAuthorization(AuthoizationContext filterContext)
    {
        VAR请求= filterContext.HttpContext.Request;
        VAR头= Convert.ToBoolean(request.Headers [特殊页眉名称]);        如果(!(头|| request.IsSecureConnection))
        {
            HandleNonHttpsRequest(filterContext);
        }
    }
}

这个方法,它继承的 RequireHttpsAttribute ,检查是否有一定的头是从页面present,如果缺少或假,页面不安全的,然后它会调用 HandleNonHttpsRequest ,否则就什么也不做。

我们使用的起订量和NUnit进行测试。我已经发现了一些资源,帮助构建起订量一个fakeHttpContext,但老实说,我不知道如何使用它或在哪里我的单元测试中去,以确保假HttpContexts有或者没有引起 HandleNonHttpsRequest 方法调用。

我真的AP preciate这个问题的任何指导。


解决方案

  //安排
VAR语境=新的模拟< HttpContextBase>();
VAR要求=新的模拟< Htt的prequestBase>();
VAR标题=新的NameValueCollection
{
    {特殊页眉名称,假}
};
request.Setup(X => x.Headers).Returns(头);
request.Setup(X => x.HttpMethod).Returns(GET);
request.Setup(X => x.Url).Returns(新的URI(http://www.example.com));
request.Setup(X => x.RawUrl).Returns(/家/指数);
context.Setup(X => x.Request)返回(request.Object);
VAR控制器=新的模拟< ControllerBase>();VAR actionDescriptor =新的模拟< ActionDescriptor>();
VAR controllerContext =新的ControllerContext(context.Object,新的RouteData(),controller.Object);
VAR filterContext =新AuthorizationContext(controllerContext,actionDescriptor.Object);
VAR SUT =新MyClass的();//行为
sut.OnAuthorization(filterContext);//断言
Assert.IsInstanceOfType(filterContext.Result的typeof(RedirectResult));
VAR redirectResult =(RedirectResult)filterContext.Result;
Assert.AreEqual(https://www.example.com/home/index,redirectResult.Url);

I am very, very new to unit testing and am trying to write a test for a pretty simple method:

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);
        }
    }
}

This method, which inherits from the RequireHttpsAttribute, checks if a certain header is present from a page, if it's missing or false, and the page is not secure, then it will call HandleNonHttpsRequest, otherwise it does nothing.

We are using Moq and Nunit for testing. I have found some resources to help build a fakeHttpContext with Moq, but honestly I'm not sure how to use it or where to go within my unit tests to ensure that fake HttpContexts are or are not causing the HandleNonHttpsRequest method to call.

I really appreciate any guidance with this issue.

解决方案

// 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);

这篇关于如何使一个单元测试来测试检查请求头的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆