2009-10-09 36 views
6

Là một phần của một thử nghiệm đơn vị tôi đang cố gắng để thử giá trị trả về của FormsIdentity.Ticket.UserDataMocking FormsIdentity.Ticket.UserData với Moq

Sau đây sẽ KHÔNG làm việc nhưng nó sẽ cho một ý tưởng về những gì tôi cố gắng để làm:

var principal = Mock<IPrincipal>(); 
var formsIdentity = Mock<FormsIdentity>(); 
formsIdentity.Setup(a => a.Ticket.UserData).Returns("aaa | bbb | ccc"); 
principal.Setup(b => b.Identity).Returns(formsIdentity.Object); 

mã tôi cố gắng để kiểm tra trông giống như sau:

FormsIdentity fIdentity = HttpContext.Current.User.Identity as FormsIdentity; 
string userData = fIdentity.Ticket.UserData; 

Tất cả tôi muốn làm trong bài kiểm tra đơn vị của tôi là giả giá trị trả về từ FormsIdentity.Ti cket.UserData. Nhưng khi tôi chạy mã trong phần đầu tiên, tôi gặp lỗi khi cố gắng giả lập FormsIdentity. Lỗi nói kiểu gõ giả phải là một giao diện, lớp trừu tượng hoặc lớp không bị niêm phong.

Tôi đã cố gắng sử dụng IIdentity thay vì FormsIdentity (FormsIdentity là triển khai IIdentity) nhưng IIdentity không có .Ticket.UserData.

Vậy làm cách nào tôi có thể viết bài kiểm tra này để tôi nhận được một giá trị từ FormsIdentity.Ticket.UserData?

+0

Hóa ra phương pháp tôi đã cố gắng thử nghiệm đã được thực hiện quá nhiều. Nó đã vi phạm các mô hình trách nhiệm duy nhất mà đã làm cho nó khó khăn để kiểm tra. Tôi đã từ khi tái cấu trúc phương pháp. Đối với câu hỏi gốc - nó không xuất hiện có bất kỳ cách nào để tạo FormsIdentity.Ticket.UserData vì nó là một phần của một lớp được niêm phong – codette

Trả lời

0

Tôi không phải là chuyên gia Kiểm tra Đơn vị, bằng bất kỳ cách nào, chỉ cần làm cho đôi chân của tôi bị ướt trong khu vực.

Không phải là quá mức cần thiết để giả định danh tính trong thử nghiệm đơn vị, bởi vì mã nhận dạng là mã mà bạn có thể giả định các công trình đã được cô lập? (Ví dụ, đó là mã của Microsoft?) Ví dụ, khi đơn vị kiểm tra mã của riêng bạn, bạn sẽ không cần phải giả lập một trong các đối tượng Khung. Ý tôi là, bạn có bao giờ cần giả lập một Danh sách hoặc một từ điển không? Điều đó đang được nói, nếu bạn thực sự muốn kiểm tra mã của bạn một cách cô lập hoặc vì một lý do nào đó có quyền kiểm soát siêu tốt đối với dữ liệu được trả về trong Userdata, bạn có thể viết Giao diện cho tương tác giữa Mã nhận dạng và mã của bạn hay không ?

Public Interface IIdentityUserData 
    Readonly Property UserData As String 
End Interface 

Public Class RealIdentityWrapper 
Implements IIdentityUserData 

Private _identity as FormsIdentity 
Public Sub New(identity as FormsIdentity) 
    'the real version takes in the actual forms identity object 
    _identity = identity 
End Sub 
Readonly Property UserData As String Implements IIDentityUserData.UserData 
    If not _identity is nothing then 
     Return _identity.Ticket.UserData 
    End If 
End Property 
End Class 

'FAKE CLASS...use this instead of Mock 
Public Class FakeIdentityWrapper 
Implements IIdentityUserData 


Readonly Property UserData As String Implements IIDentityUserData.UserData 
    If not _identity is nothing then 
      Return "whatever string you want" 
    End If 
End Property 
End Class 



'here's the code that you're trying to test...modified slightly 
Dim fIdentity As FormsIdentity= HttpContext.Current.User.Identity 
Dim identityUserData As IIdentityUserData 

identityUserData = 
'TODO: Either the Real or Fake implementation. If testing, inject the Fake implementation. If in production, inject the Real implementation 

Dim userData as String 
userData = identityUserData.UserData 

Hope this helps

+0

Lỗi của tôi khi cố gắng giữ câu hỏi ngắn gọn. Nhưng điều này sẽ không hiệu quả đối với tôi vì danh tính chính được truy cập bên trong phương pháp mà tôi đang cố gắng kiểm tra. Nhưng bạn đúng là tôi không kiểm tra phần bên phải của phương pháp của tôi – codette