HTTP 处理程序当前请求服务器变量的集成测试

本文关键字:服务器 变量 集成测试 请求 处理 程序 HTTP | 更新日期: 2023-09-27 17:56:42

我需要为数据访问层中具有HttpHandler.Current.Request服务器变量的方法编写集成测试。它抛出错误"对象引用未设置为对象的实例。我们可以对 HttpHandler.Current.Request 服务器变量进行集成测试吗?

实现:

public SubmissionHeaderDTO GetRefNo(VariablesDTO requestVariables)
        {
            using(var sqlConn = new SqlConnection(Configuration.DBConnection))
            {
                sqlConn.Open();                
                    using (var sqlcmd = new SqlCommand("usp_testInsert", sqlConn))
                    {
                        sqlcmd.CommandType = CommandType.StoredProcedure;
                        sqlcmd.Parameters.Add("@FormId", SqlDbType.UniqueIdentifier).Value = requestVariables.Id;
                        sqlcmd.Parameters.Add("@FormCode", SqlDbType.VarChar, 10).Value = requestVariables.Prefix;
                        sqlcmd.Parameters.Add("@FormTitle", SqlDbType.VarChar, 200).Value = requestVariables.Title;
                        sqlcmd.Parameters.Add("@User", SqlDbType.VarChar, 50).Value = requestVariables.User;
                        sqlcmd.Parameters.Add("@Url", SqlDbType.VarChar, 255).Value = requestVariables.Url;
                        sqlcmd.Parameters.Add("@Host", SqlDbType.VarChar, 50).Value = requestVariables.RemoteHostName;
                        sqlcmd.Parameters.Add("@RemoteHost", SqlDbType.VarChar, 50).Value = requestVariables.RemoteHost;
                        sqlcmd.Parameters.Add("@UserAgent", SqlDbType.VarChar, 255).Value = requestVariables.UserAgent;
                        sqlcmd.Parameters.Add("@Referrer", SqlDbType.VarChar, 255).Value = requestVariables.HttpReferrer;
                        sqlcmd.Parameters.Add("@ClosingCode", SqlDbType.VarChar, 5).Value = requestVariables.Code;
                        SqlParameter outputSubmissionId = new SqlParameter("@SubmissionId", SqlDbType.UniqueIdentifier)
                        {
                            Direction = ParameterDirection.Output
                        };
                        SqlParameter outputSubmissionSequence = new SqlParameter("@SubmitSequence", SqlDbType.NVarChar, 30)
                        {
                            Direction = ParameterDirection.Output
                        };
                        sqlcmd.Parameters.Add(outputSubmissionId);
                        sqlcmd.Parameters.Add(outputSubmissionSequence);
                        sqlcmd.ExecuteNonQuery();
                        var submissionHeaderDto = new SubmissionHeaderDTO()
                        {
                            SubmissionId = (Guid)outputSubmissionId.Value,
                            SubmitSequence = outputSubmissionSequence.Value.ToString()
                        };
                        return submissionHeaderDto;
                    }
            }
        }

我的 DTO 如下:

public class VariablesDTO
    {
        public string Prefix { get; set; }
        public string Code { get; set; }
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string User { get { return HttpContext.Current.User.Identity.Name; } }
        public string Url { get { return HttpContext.Current == null || HttpContext.Current.Handler == null ? null : HttpContext.Current.Request.Url.AbsoluteUri; } }
        public string UserAgent { get { return HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"]; } }
        public string HttpReferrer { get { return HttpContext.Current.Request.ServerVariables["HTTP_REFERER"]; } }
        public string RemoteHost { get { return HttpContext.Current.Request.ServerVariables["REMOTE_HOST"]; } }
        public string RemoteHostName { get { return System.Net.Dns.GetHostEntry(HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]).HostName; } }
    }

下面的集成测试抛出了一个错误,其中"对象引用未设置为DTO中http服务器变量的对象实例。

var variablesDTO = new VariablesDTO();
            VariablesDTO.Code = "ABC";
            VariablesDTO.Prefix = "DEF";
            VariablesDTO.Title = "Test form";
            VariablesDTO.Id = Guid.NewGuid();
            var submitSequence = "DEF-1";
            //act
            var results = this._formDataService.GetRefNo(variablesDTO);
            //assert            
            Assert.AreEqual(submitSequence, results.SubmitSequence);

HTTP 处理程序当前请求服务器变量的集成测试

不要让你的 dto 依赖于其他对象,比如 HttpContext。 dto 的全部意义在于成为轻量级数据传输机制。 这些应该只有自己的内部状态的获取者和设置者。 从 HttpContext 中获取信息并将其复制到 dto 中。 你的另一个问题是你依赖于HttpContext.Current,这是一个静态调用,不容易被模拟用于单元测试。 您可以考虑将其隐藏在界面后面,以便您也可以模拟它。