2012-12-20 15 views
12

Tôi có một phương thức trả vềCách đọc thuộc tính của một loại ẩn danh?

return new System.Web.Mvc.JsonResult() 
{      
    Data = new 
    { 
     Status = "OK", 
    } 
} 

tôi cần phải viết một bài kiểm tra đơn vị mà tôi cần phải xác minh rằng jsonResult.Data.status= "OK".

Làm cách nào để đọc thuộc tính trạng thái?

Cập nhật: Tôi đã thử [assembly: InternalsVisibleTo ("TestingAssemblyName")], nhưng điều đó không giúp ích gì. Tôi đã nhận được lỗi {"'System.Web.Mvc.JsonResult' không chứa định nghĩa cho 'Trạng thái'"}

Bên cạnh đó, tôi cho rằng tôi không muốn sửa đổi mã mà tôi đang thử nghiệm.

Vì vậy, tôi đã lấy lời khuyên của Jon và sử dụng sự phản chiếu.

 var type = jsonResult.Data.GetType(); 

     var pinfo = type.GetProperty("Status"); 

     string statusValue = pinfo.GetValue(jsonResult.Data,null).ToString(); 

     Assert.AreEqual("OK", statusValue); 
+0

Trong một MS Unit Test hoặc Javascript? –

+0

Nếu bạn đang làm điều này từ C#, bạn chỉ có thể sử dụng 'năng động' và để cho các chất kết dính năng động chăm sóc nó. – vcsjones

+0

kiểm tra đơn vị gallio. Những gì tôi đang cố gắng là Assert.AreEqual ("OK", jsonResult.Data.Status) – developer747

Trả lời

17

Phương pháp đơn giản nhất có lẽ sẽ là sử dụng gõ động:

dynamic foo = ret.Data; 
Assert.AreEqual("OK", foo.status); 

Lưu ý rằng bạn sẽ cần phải sử dụng [InternalsVisibleTo] để cung cấp cho đơn vị truy cập lắp ráp thử nghiệm của bạn với các loại vô danh trong sản xuất của bạn lắp ráp, vì nó sẽ được tạo ra với quyền truy cập internal.

Hoặc, chỉ cần sử dụng sự phản chiếu.

6

dynamic:

dynamic testObject = YourMethodThatReturnsDynamicObject().Data; 
Assert.AreEqual("OK", testObject.Status); 
+1

Giá trị dự kiến ​​sẽ là đối số đầu tiên cho 'AreEqual' và giá trị thực tế sẽ là giá trị thứ hai. –

+0

@JonSkeet .. có bạn đi, mặc dù như tôi đã gõ nó tôi chỉ không nghĩ (đôi khi intellisense đi một chặng đường dài!). –

+0

@ AnonymousVoter: Tôi đánh giá cao sự bỏ phiếu thông cảm .. khó có được bất kỳ khi nào bạn trả lời cùng lúc với Jon! :) –