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”]作为列表;
}