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

时间:2016-07-12 18:42:28

标签: c# model-view-controller

我需要为数据访问层中的方法编写一个集成测试,该测试已经获得了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);

1 个答案:

答案 0 :(得分:0)

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