使用TestControllerBuilder返回特定的UserHostAddress

时间:2010-09-10 20:35:59

标签: asp.net-mvc nunit mocking mvccontrib

我正在使用MvcContrib和TestControllerBuilder为我的控制器编写测试。

我正在编写我的错误处理控制器的测试,如下所示:

    public JsonResult HttpError()
    {
        Exception ex = null;

        try
        {
            ex = (Exception)HttpContext.Application[Request.UserHostAddress.ToString()];
        }
        catch
        {
        }

        if( ex != null )
        {
            return Json( new ErrorViewModel() { Message = ex.Message, Source = ex.Source, StackTrace = ex.StackTrace, Type = ex.GetType().Name}, JsonRequestBehavior.AllowGet );
        }
        else
        {
            return Json( new ErrorViewModel() { Message = "An error has occured." }, JsonRequestBehavior.AllowGet );
        }
    }

基本上,我的全局错误处理将最后一个异常放入Application存储中,并且此控制器尝试将其拉回,将其转换为Json,然后返回它(我们将所有内容作为Json返回,因为这些方法仅被调用为网络服务)。

为了对此进行全面测试,我需要UserHostAddress包含可预测的内容,但TestControllerBuilder设置的对象会将该属性保留为null。

我该如何使这项工作?我不确定如何在我的测试中完成这项工作。

1 个答案:

答案 0 :(得分:4)

TestControllerBuilder使用Rhino.Mocks来模拟HttpContext。知道这一点,你可以将Request对象放回“记录”模式并找出响应:

controller.Request.BackToRecord();
controller.Request.Stub(r => r.UserHostAddress).Return("75.142.12.45");
controller.Request.Replay();

在初始化控制器之后但在方法调用之前执行此操作。