MOQ

2009-10-09 3 views
6

와 비웃음 FormsIdentity.Ticket.UserData 내가 다음은 작동하지 않습니다 FormsIdentity.Ticket.UserDataMOQ

의 반환 값을 조롱하려고하지만 내가 무엇의 아이디어를 줄 것이다 단위 테스트의 일환으로

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); 

내가 테스트를 시도하고 코드는 다음과 같은 : : 일을하려고하는 것은

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

내 단위 테스트에서하고 싶은 모든 FormsIdentity.Ti의 반환 값 가짜 cket.UserData. 그러나 첫 번째 섹션에서 코드를 실행하면 FormsIdentity를 조롱 할 때 오류가 발생합니다. 이 오류는 모의 형식이 인터페이스, 추상 클래스 또는 비 - 봉합 클래스 여야한다고 말합니다.

FormsIdentity (FormsIdentity는 IIdentity의 구현 임) 대신 IIdentity를 사용하려고했지만 IIdentity에는 .Ticket.UserData가 없습니다.

그래서이 테스트를 작성하여 FormsIdentity.Ticket.UserData에서 값을 얻을 수 있습니까?

+0

내가 너무 많은 일을했다 테스트하려고했던 방법을 밝혀하는 데 도움이됩니다. 그것은 테스트하기 어려운 단일 책임 패턴을 위반했습니다. 이후 리팩터링했습니다. 원래 질문에 대해서는 FormsIdentity.Ticket.UserData를 모방 할 방법이 없습니다. 봉인 된 클래스의 일부이기 때문에 – codette

답변

0

나는 단위 테스트 전문가가 아니며, 어떤 의미에서든 지역에서 젖은 채 젖어 있습니다.

신원 코드가 이미 분리되어 작동한다고 가정 할 수있는 코드이기 때문에 단위 테스트에서 신원을 조롱하는 것이 과도하지 않습니까? (즉, Microsoft의 코드입니까?) 예를 들어, 자신의 코드를 단위 테스트 할 때 Framework 객체 중 하나를 조롱하지 않아도됩니다. 목록이나 사전을 조롱 할 필요가 있니?

당신이 진짜로 격리 된 코드를 테스트하거나 Userdata에서 반환 된 데이터를 매우 정밀하게 제어하려는 경우 Identity와 코드 간의 상호 작용을위한 인터페이스를 작성할 수는 없습니까? ?

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 

희망이

+0

질문을 간결하게 유지하려고 시도한 것에 대한 저의 잘못입니다. 하지만이 방법은 테스트 할 방법에서 Principal ID가 액세스되고 있기 때문에 나에게 도움이되지 않습니다. 하지만 내 방법의 올바른 부분을 테스트하지 않는 것이 맞습니다. – codette