2013-06-21 30 views
10

tôi có mã này trong C# khiển MVC:Làm thế nào để truy cập dữ liệu JsonResult khi kiểm tra trong ASP.NET MVC

[HttpPost] 
    public ActionResult Delete(string runId) 
    { 
     if (runId == "" || runId == null) 
     { 
      return this.Json(new { error = "Null or empty params" }); 
     } 
     try 
     { 
      int userId = (int)Session["UserId"]; 
      int run = Convert.ToInt32(runId); 

      CloudMgr cloud = new CloudMgr(Session); 
      cloud.DeleteRun(userId, run); 

      return this.Json(new { success = true }); 
     } 
     catch (Exception ex) 
     { 
      return this.Json(new { error = ex.ToString() }); 
     } 
    } 

Làm thế nào tôi có thể truy cập Json "lỗi" lĩnh vực của tôi trong một ControllerTest để kiểm tra xem nó là null hay không?

[TestMethod] 
    public void DeleteWrongParam() 
    { 
     WhatIfController controller = new WhatIfController(); 
     controller.ControllerContext = 
     TestUtils.CreateMockSessionControllerContext().Object as ControllerContext; 

     JsonResult result = controller.DeleteWhatIf(null) as JsonResult; 

Assert.IsNotNull(result.Data.error); là những gì tôi muốn làm. Bất kỳ ý tưởng? Cảm ơn.

Trả lời

15

bạn có thể sử dụng như thế này, Kết quả sẽ được định nghĩa đối tượng mong đợi. Vì vậy, trong trường hợp thành công od, cờ thành công của bạn sẽ TRUE nếu không sai và nếu sai thì bạn nên mong đợi rằng tài sản lỗi được cập nhật với thông báo lỗi.

 JsonResult jsonResult = oemController.List() as JsonResult; 
     JavaScriptSerializer serializer = new JavaScriptSerializer(); 
     Result result = serializer.Deserialize<Result>(serializer.Serialize(jsonResult.Data)); 

     public class Result 
     { 
      public bool success ; 
      public string error; 
     } 
+0

Không gian tên cho lớp Kết quả là gì? Cảm ơn. – juanchoelx

+0

@juanchoelx Kết quả là lớp được định nghĩa của riêng bạn như lớp này Kết quả {public bool success; lỗi chuỗi công khai} – Devesh

+0

@juanchoelx Tôi đã cập nhật mã của mình trong câu trả lời của mình. – Devesh

18

JavaScriptSerializer tốt cho chuỗi và loại tĩnh. Ở đây bạn đã tạo kiểu ẩn danh là Json (new {success = true}). Trường hợp này, bạn đã sử dụng loại động tốt hơn.

JsonResult result = controller.DeleteWhatIf(null) as JsonResult; 
dynamic dresult = result.Data; 
Assert.IsTrue(dresult.succes); 

Bạn cần nhập dll Microsoft.CSharp vào dự án thử nghiệm.

Nếu kiểm tra và điều khiển của bạn là trong hội đồng khác nhau, bạn cần phải thực hiện việc lắp ráp thử nghiệm một "người bạn" lắp ráp lắp ráp bộ điều khiển, như này:

[assembly: InternalsVisibleTo ("tên lắp ráp testproject")]

+0

+1 cho mẹo InternalsVisibleTo. Tôi đã cố gắng làm điều này mà không có thuộc tính lắp ráp nó ở đó và không thể tìm ra lý do tại sao nó được thổi lên lúc đầu. –

+0

Đã chọn. Tôi đã chỉnh sửa câu trả lời để thu hút sự chú ý đến phần về 'InternalsVisibleTo'. –

+2

bạn có thể làm cho nó dễ dàng hơn 'kết quả động = controller.DeleteWhatIf (null) như JsonResult; Assert.IsNotNull (result.Data.error); '=) – RMazitov

Các vấn đề liên quan