2011-01-06 37 views
8

Một phương thức hành động trong ứng dụng ASP.NET MVC2 của tôi trả về một đối tượng JsonResult và trong thử nghiệm đơn vị của tôi, tôi muốn kiểm tra xem đối tượng JSON trả về có chứa các giá trị mong muốn hay không.Từ khóa "động" và dữ liệu JSON

Tôi cố gắng này:

1. dynamic json = ((JsonResult)myActionResult).Data; 
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel); 

Nhưng tôi nhận được một RuntimeBinderException " 'đối tượng' không chứa một định nghĩa cho 'ERRORLEVEL'".

Tuy nhiên, khi tôi đặt điểm ngắt trên dòng 2 và kiểm tra biến động json (xem hình bên dưới), rõ ràng là không chứa chuỗi ErrorLevel và nó có giá trị mong đợi, vì vậy nếu trình kết nối thời gian chạy không vui chơi thử nghiệm sẽ vượt qua.

Snapshot of the Locals debugger window

Tôi không nhận được gì? Tôi đang làm gì sai và làm thế nào tôi có thể sửa lỗi này? Làm thế nào tôi có thể làm cho xác nhận vượt qua?

Trả lời

15

Bạn không thực sự cần động. Đây là một ví dụ. Giả sử bạn đã có những hành động sau đây mà bạn muốn kiểm tra cho đơn vị:

public ActionResult Index() 
{ 
    return Json(new { Id = 5, Foo = "bar" }); 
} 

và thử nghiệm tương ứng:

// act 
var actual = subjectUnderTest.Index(); 

// assert 
var data = new RouteValueDictionary(actual.Data); 
Assert.AreEqual(5, data["Id"]); 
Assert.AreEqual("bar", data["Foo"]); 

Ngoài ra bạn có thể tìm thấy những following blog post hữu ích.

+3

nó * đang hoạt động. Và tôi đánh giá cao cách nó hoạt động nhưng vẫn trông giống như một hack. Rất trực quan để sử dụng RouteValueDictionary để truy vấn nội dung của một đối tượng ẩn danh ... Tôi chỉ có thể hy vọng nhớ được giải pháp này vì tôi không nghĩ mình có thể tự mình làm được điều này. Không phải là có một lớp khác nhau mà sẽ làm cùng một thủ thuật với các đối tượng vô danh, một cái gì đó không bị ẩn trong System.Web.dll? (kỳ lạ này sống trong không gian tên System.Web.Routing, nhưng không trong System.Web.Routing.dll) –

2

Thuộc tính Data của JsonResult là loại Object có nghĩa là, mặc dù bạn có khai báo động, loại được đặt vẫn là Object. Vấn đề khác là bạn đang sử dụng một loại vô danh như Data và sau đó cố gắng truy cập vào đó như là một cá thể được khai báo ngoài phạm vi áp dụng của nó. Sử dụng kỹ thuật @ Darin để truy cập các giá trị thuộc tính bằng cách sử dụng RouteValueDictionary.

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