2012-01-25 59 views
1

一個會議上,我有一個控制器,它依賴於一個Session變量。爲了單元測試這個控制器,我想出了以下解決方案。它的工作原理,但我想知道是否有更好的/更清潔的方式。由於單元測試控制器,它取決於變量

控制器

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); 
    } 

單元測試

 [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); 
    } 
+2

使用mvcContrib測試助手時,我可以用手動的其他實現方式之一。會爲你節省很多時間。 – gdoron

回答

1

你對Session有依賴性。你可以將你的代碼移動到一個可測試的方法中,在方法級別注入依賴項。看起來就像你在這條路上,我只是將代碼抽象到它自己的方法中,允許您測試功能,而不管數據是否來自會話。

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); 
    }