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