How to get rid of the GridViewCommandEventArgs coupling?

本帖最後由 luckiejacky 於 2015-4-5 13:51 編輯

I want to build some tests for this method,
And I know now, I should have built the tests first.
But now I have to do that now because of my lack of this experience.
  1. protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
  2.         {
  3.             if (Page.IsPostBack)
  4.             {
  5.                 if (e.CommandName == "Insert")
  6.                 {
  7.                     con.Open();
  8.                     trans = con.BeginTransaction("Insert_Coherent");

  9.                     Int32 newItemNo = -1;

  10.                     try
  11.                     {
  12.                         InsertIssueLog(ref newItemNo, e);

  13.                         InsertSupportDoc(newItemNo, e);

  14.                         InsertApprovals(newItemNo, e);

  15. ....
  16. protected int InsertSupportDoc(Int32 newItemNo, GridViewCommandEventArgs e)
  17.         {
  18.             try
  19.             {               
  20.                 GridViewRow row = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
  21.                 FileUpload fuSupportDoc = (FileUpload)row.FindControl("FileUploadSupportDoc");
  22.                 if (GridView1.Rows.Count == 0)
  23.                 {                 
  24.                     fuSupportDoc = (FileUpload)row.FindControl("FileUploadSupportDoc");
  25.                 }
  26.                 else
  27.                 {                 
  28.                     fuSupportDoc = (FileUpload)GridView1.FooterRow.FindControl("FileUploadSupportDoc");
  29.                 }            
  30.             
  31.                 SqlCommand comm = new SqlCommand(@"INSERT INTO SupportDoc
  32.                               (ItemNo, ImageData) VALUES (@ItemNo, @ImageData)", con, trans);

  33.                 comm.Parameters.AddWithValue("@ItemNo", newItemNo);
  34.                 comm.Parameters.AddWithValue("@ImageData", fuSupportDoc.FileBytes);

  35.                 comm.ExecuteNonQuery();
  36.                 return 0;
  37.             }
  38.             catch (Exception ex) {
  39.                 Response.Write(ex.Message);
  40.                 return -1;
  41.             }

  42.         }
複製代碼

In the three insert lines of code, how do I get rid of the coupling of e
because it is irrelevant and preventing clean unit tests...

I want to build some tests for this method,
And I know now, I should have built the tests first.
But ...
luckiejacky 發表於 2015-4-5 13:47



    first, pack your sql related code in a layer
don't pack it here

second, use early return instead of multi layer if

e.g.
if !Page.IsPostBack {
   return fail??
}
//I don't care non insert
if e.CommandName != "Insert"{
   
}

TOP