Asp.net mvc 单元测试依赖于会话变量的控制器
我有一个依赖于会话变量的控制器。为了对这个控制器进行单元测试,我提出了以下解决方案。这很有效,但我想知道是否有更好/更干净的方法。谢谢 控制器Asp.net mvc 单元测试依赖于会话变量的控制器,asp.net-mvc,unit-testing,asp.net-mvc-3,Asp.net Mvc,Unit Testing,Asp.net Mvc 3,我有一个依赖于会话变量的控制器。为了对这个控制器进行单元测试,我提出了以下解决方案。这很有效,但我想知道是否有更好/更干净的方法。谢谢 控制器 public JsonResult UpdateStatus(ImageUpdateStatus imageUpdateStatus, SessionStateItemCollection sessionItems = null) { var data = new object(); string stat
public JsonResult UpdateStatus(ImageUpdateStatus imageUpdateStatus, SessionStateItemCollection sessionItems = null)
{
var data = new object();
string status = null;
ImageInfo imageInfo = new ImageInfo();
IImageInfoServices svcImageInfo = new ImageInfoServicesRepository();
imageInfo = svcImageInfo.GetImageByImageId(imageUpdateStatus.ImageId);
IDeviceControlServices svcDevice = new DeviceControlServicesRespository();
IPVSCommandServices svcPVSCmds = new PVSCommandServicesRespository();
if (imageUpdateStatus.Task == "prep")
{
List<UpdateReasonForm> updateReasonForms;
if (sessionItems != null)
{
updateReasonForms = sessionItems["UpdateReasonForms"] as List<UpdateReasonForm>;
}
else
{
updateReasonForms = Session["UpdateReasonForms"] as List<UpdateReasonForm>;
}
foreach (var item in updateReasonForms)
{
if (item.ImageId == imageInfo.ImageId)
{
status = svcPVSCmds.PrepImage(imageInfo, item.NewVersion);
}
}
data = new
{
status
};
}
if (imageUpdateStatus.Task == "boot")
{
status = svcDevice.Boot(imageInfo.ImageId);
data = new
{
status
};
}
return this.Json(data, JsonRequestBehavior.AllowGet);
}
公共JsonResult UpdateStatus(ImageUpdateStatus ImageUpdateStatus,SessionStateItemCollection sessionItems=null)
{
var data=新对象();
字符串状态=空;
ImageInfo ImageInfo=新的ImageInfo();
iImageInfoServicesSVCMageInfo=新的ImageInfoServicesRepository();
imageInfo=svcmageInfo.GetImageByImageId(imageUpdateStatus.ImageId);
IDeviceControlServices svcDevice=新设备控制服务Respository();
IPVSCommandServices svcPVSCmds=新的PVSCommandServicesRespository();
if(imageUpdateStatus.Task==“prep”)
{
列表更新信息;
if(sessionItems!=null)
{
UpdateRasonForms=sessionItems[“UpdateRasonForms”]作为列表;
}
其他的
{
updateReasonForms=会话[“updateReasonForms”]作为列表;
}
foreach(UpdateRasonForms中的变量项)
{
if(item.ImageId==imageInfo.ImageId)
{
status=svcPVSCmds.preprimage(imageInfo,item.NewVersion);
}
}
数据=新
{
地位
};
}
if(imageUpdateStatus.Task==“启动”)
{
状态=svcDevice.Boot(imageInfo.ImageId);
数据=新
{
地位
};
}
返回this.Json(数据,JsonRequestBehavior.AllowGet);
}
单元测试
[TestMethod()]
public void UpdateStatusTest()
{
BuildController target = new BuildController(); // TODO: Initialize to an appropriate value
ImageUpdateStatus imageUpdateStatus = new ImageUpdateStatus(); // TODO: Initialize to an appropriate value
imageUpdateStatus.ImageId = 3;
imageUpdateStatus.Task = "prep";
UpdateReasonForm updateReasonForm = new UpdateReasonForm();
updateReasonForm.ImageId = 3;
updateReasonForm.NewVersion = "TestThis";
List<UpdateReasonForm> updateReasonForms = new List<UpdateReasonForm>();
updateReasonForms.Add(updateReasonForm);
var sessionItems = new SessionStateItemCollection();
sessionItems["UpdateReasonForms"] = updateReasonForms;
JsonResult actual;
actual = target.UpdateStatus(imageUpdateStatus, sessionItems);
}
[TestMethod()]
public void UpdateStatusTest()
{
BuildController目标=新建BuildController();//TODO:初始化为适当的值
ImageUpdateStatus ImageUpdateStatus=new ImageUpdateStatus();//TODO:初始化为适当的值
imageUpdateStatus.ImageId=3;
imageUpdateStatus.Task=“prep”;
UpdateReasonForm UpdateReasonForm=新的UpdateReasonForm();
updateReasonForm.ImageId=3;
updateReasonForm.NewVersion=“TestThis”;
List updateReasonForms=新列表();
Add(updateReasonForm);
var sessionItems=new SessionStateItemCollection();
sessionItems[“UpdateRasonForms”]=UpdateRasonForms;
JsonResult实际;
实际=target.UpdateStatus(imageUpdateStatus,sessionItems);
}
您可以模拟会话状态,而不是将会话值作为参数传入,如下所示:
您可以模拟会话状态,而不是将会话值作为参数传递,如下所示:
您依赖于会话。您可以将代码移动到一个可测试的方法中,在该方法中在方法级别注入依赖项。看起来您正走在这条道路上,我只是将代码抽象为它自己的方法,允许您测试功能,而不管数据是否来自会话
public JsonResult UpdateStatusDependencyInjection(ImageUpdateStatus imageUpdateStatus, Dictionary<string, object> sessionValues)
{
var data = new object();
string status = null;
ImageInfo imageInfo = new ImageInfo();
IImageInfoServices svcImageInfo = new ImageInfoServicesRepository();
imageInfo = svcImageInfo.GetImageByImageId(imageUpdateStatus.ImageId);
IDeviceControlServices svcDevice = new DeviceControlServicesRespository();
IPVSCommandServices svcPVSCmds = new PVSCommandServicesRespository();
if (imageUpdateStatus.Task == "prep")
{
List<UpdateReasonForm> updateReasonForms;
if (sessionItems != null)
{
updateReasonForms = sessionItems["UpdateReasonForms"] as List<UpdateReasonForm>;
}
else
{
updateReasonForms = Session["UpdateReasonForms"] as List<UpdateReasonForm>;
}
foreach (var item in updateReasonForms)
{
if (item.ImageId == imageInfo.ImageId)
{
status = svcPVSCmds.PrepImage(imageInfo, item.NewVersion);
}
}
data = new
{
status
};
}
if (imageUpdateStatus.Task == "boot")
{
status = svcDevice.Boot(imageInfo.ImageId);
data = new
{
status
};
}
return this.Json(data, JsonRequestBehavior.AllowGet);
}
public JsonResult UpdateStatus依赖注入(ImageUpdateStatus ImageUpdateStatus,字典会话值)
{
var data=新对象();
字符串状态=空;
ImageInfo ImageInfo=新的ImageInfo();
iImageInfoServicesSVCMageInfo=新的ImageInfoServicesRepository();
imageInfo=svcmageInfo.GetImageByImageId(imageUpdateStatus.ImageId);
IDeviceControlServices svcDevice=新设备控制服务Respository();
IPVSCommandServices svcPVSCmds=新的PVSCommandServicesRespository();
if(imageUpdateStatus.Task==“prep”)
{
列表更新信息;
if(sessionItems!=null)
{
UpdateRasonForms=sessionItems[“UpdateRasonForms”]作为列表;
}
其他的
{
updateReasonForms=会话[“updateReasonForms”]作为列表;
}
foreach(UpdateRasonForms中的变量项)
{
if(item.ImageId==imageInfo.ImageId)
{
status=svcPVSCmds.preprimage(imageInfo,item.NewVersion);
}
}
数据=新
{
地位
};
}
if(imageUpdateStatus.Task==“启动”)
{
状态=svcDevice.Boot(imageInfo.ImageId);
数据=新
{
地位
};
}
返回this.Json(数据,JsonRequestBehavior.AllowGet);
}
您依赖于会话。您可以将代码移动到一个可测试的方法中,在该方法中在方法级别注入依赖项。看起来您正走在这条道路上,我只是将代码抽象为它自己的方法,允许您测试功能,而不管数据是否来自会话
public JsonResult UpdateStatusDependencyInjection(ImageUpdateStatus imageUpdateStatus, Dictionary<string, object> sessionValues)
{
var data = new object();
string status = null;
ImageInfo imageInfo = new ImageInfo();
IImageInfoServices svcImageInfo = new ImageInfoServicesRepository();
imageInfo = svcImageInfo.GetImageByImageId(imageUpdateStatus.ImageId);
IDeviceControlServices svcDevice = new DeviceControlServicesRespository();
IPVSCommandServices svcPVSCmds = new PVSCommandServicesRespository();
if (imageUpdateStatus.Task == "prep")
{
List<UpdateReasonForm> updateReasonForms;
if (sessionItems != null)
{
updateReasonForms = sessionItems["UpdateReasonForms"] as List<UpdateReasonForm>;
}
else
{
updateReasonForms = Session["UpdateReasonForms"] as List<UpdateReasonForm>;
}
foreach (var item in updateReasonForms)
{
if (item.ImageId == imageInfo.ImageId)
{
status = svcPVSCmds.PrepImage(imageInfo, item.NewVersion);
}
}
data = new
{
status
};
}
if (imageUpdateStatus.Task == "boot")
{
status = svcDevice.Boot(imageInfo.ImageId);
data = new
{
status
};
}
return this.Json(data, JsonRequestBehavior.AllowGet);
}
public JsonResult UpdateStatus依赖注入(ImageUpdateStatus ImageUpdateStatus,字典会话值)
{
var data=新对象();
字符串状态=空;
ImageInfo ImageInfo=新的ImageInfo();
iImageInfoServicesSVCMageInfo=新的ImageInfoServicesRepository();
imageInfo=svcmageInfo.GetImageByImageId(imageUpdateStatus.ImageId);
IDeviceControlServices svcDevice=新设备控制服务Respository();
IPVSCommandServices svcPVSCmds=新的PVSCommandServicesRespository();
if(imageUpdateStatus.Task==“prep”)
{
列表更新信息;
if(sessionItems!=null)
{
UpdateRasonForms=sessionItems[“UpdateRasonForms”]作为列表;
}
其他的
{
updateReasonForms=会话[“updateReasonForms”]作为列表;
}