2009-12-09 18 views
26

Tôi đã tìm kiếm stackoverflow và googled bốn một vài giờ và vẫn không tìm thấy bất kỳ giải pháp cho vấn đề "tầm thường" của tôi.Làm cách nào để đơn vị kiểm tra một phương pháp điều khiển có thuộc tính [Ủy quyền] được áp dụng?

Nếu bạn viết kiểm tra đơn vị cho [Authorize] ActionResult được lọc của mình, cách bạn giải quyết vấn đề giả mạo người dùng đó được xác thực?

Tôi có rất nhiều phương pháp ActionResult được lọc với [Authorize] và tôi muốn thử nghiệm tất cả các phương pháp ActionResult của mình bất kể chúng được lọc với [Authorize] hay không.

Một ví dụ đơn giản về những gì tôi có nghĩa là:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

Tính đến nay là kiểm tra thậm chí không đạt phương pháp ActionResult vì [Duyệt] lọc, ném ngoại lệ là: System.NullReferenceException: Object reference not set to an instance of an object.

+1

Có điều gì đó bạn không hiển thị cho chúng tôi. Bài kiểm tra bạn hiển thị sẽ không thực thi * bất kỳ bộ lọc hành động nào. Có lẽ bạn có mã mà sẽ, nhưng nó không có trong câu hỏi của bạn. Làm thế nào về toàn bộ cuộc gọi ngăn xếp cho các lỗi, cho người mới bắt đầu? –

Trả lời

25

Bạn cần phải giả lập một ngữ cảnh cho bộ điều khiển của bạn. Hãy thử sử dụng Moq

bạn sắp xếp sau đó sẽ như thế nào:

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

Bạn sẽ có thể để sau đó làm luật của bạn & Khẳng định.

Nếu bạn chưa có, tôi khuyên bạn nên xem qua NerdDinner làm trang web MVC mẫu.

+0

Awsome, điều này làm việc hoàn hảo ... Cảm ơn rất nhiều – Webking

+0

Tôi có thể tranh luận rằng bạn không cần phải thực sự kiểm tra điều này cả. Thuộc tính đã được thử nghiệm tốt bởi nhóm đã viết ASP.NET MVC. Bạn có thể tải xuống nguồn và tự mình xem. –

+8

Nó không phải là để kiểm tra thuộc tính '[Authorized]', nó là để có được xung quanh nó để kiểm tra các phương thức 'ActionResult' – AndyMcKenna

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