2008-11-17 30 views
5

Tôi đang cố gắng kiểm tra đơn vị một trang trong ứng dụng ASP.NET MVC của mình, khi được đăng lên, sẽ xóa mục của người dùng. Tôi muốn hạn chế trang này để nó chỉ có thể được đăng bởi chủ sở hữu của mục đã nói. Ban đầu, tôi muốn chỉ cần kiểm tra nhanh trong bộ điều khiển đã kiểm tra xem HttpContext.Current.User.Identity.Name có bằng với chủ sở hữu của mục không, nhưng tôi nhanh chóng nhận ra rằng việc kiểm thử đơn vị này sẽ khó khăn.Làm thế nào để bạn loại bỏ User.Identity.Name trong ASP.NET MVC?

Tôi có nên tạo giao diện cung cấp cách truy cập tên người dùng đã đăng nhập hiện tại không?

Trả lời

4

Dòng cuối cùng của câu hỏi của bạn có lẽ là giải pháp nhanh nhất, tuy nhiên, tôi không nghĩ rằng bạn cần tạo giao diện, HttpContext.Current.User đã là IPrincipalHttpContext.Current.User.Identity đã là IIdentity.

Nếu luận kiểm tra của bạn sử dụng một trong những giao diện, bộ điều khiển có thể được chế giễu để vượt qua một IIdentity mà bạn tạo ra thay vì HttpContext.Current.User.Identity

Hy vọng rằng sẽ giúp!

2

Tôi sử dụng Thread.CurrentPrincipal.Identity.Name. Nó là tầm thường để tạo ra một GenericPrincipal cho một bài kiểm tra đơn vị và đính kèm nó.

5

Bạn có thể sử dụng mã này

Controller CreateControllerAs(string userName) { 

    var mock = new Mock<ControllerContext>(); 
    mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName); 
    mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true); 

    var controller = new SomeController(); 
    controller.ControllerContext = mock.Object; 

    return controller; 
} 

Nó sử dụng moq lib

+0

Bạn có biết nơi tôi có thể tìm thấy những lớp Mock? Tôi đã xem xét tất cả các MSDN cố gắng tìm tài liệu về nó nhưng chưa thực hiện bất kỳ tiến bộ nào. –

+1

https://code.google.com/p/moq/ lib này được sử dụng ở đây – Sly

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