我需要为数据访问层中的方法编写一个集成测试,该测试已经获得了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);
答案 0 :(得分:0)
不要让你的dto依赖于像HttpContext这样的其他对象。 dto的重点是轻量级数据传输机制。这些应该只有getter和setter到它自己的内部状态。从HttpContext获取信息并将其复制到dto中。你的另一个问题是你依赖于HttpContext.Current这是一个静态调用,并且不容易被模拟用于单元测试。您可以考虑将其隐藏在界面后面,这样您也可以模拟它。