2009-10-09 18 views
6

とモッキングFormsIdentity.Ticket.UserData私は次のように動作しませんFormsIdentity.Ticket.UserData部品番号

の戻り値を模擬しようとしていますが、それは私が何のアイデアを与える必要がありますユニットテストの一環として、やろうとしている。

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の代わりにIIdentityを使用しようとしましたが(FormsIdentityはIIdentityの実装です)、IIdentityには.Ticket.UserDataがありません。

FormsIdentity.Ticket.UserDataから値を取得するには、どうすればこのテストを書くことができますか?

+0

に役立ちますが、私がテストしようとしていた方法はあまりやっていたが判明します。それはテストすることを困難にしていた単一の責任パターンに違反していました。 私はそれ以来、メソッドをリファクタリングしています。 元の質問については、FormsIdentity.Ticket.UserDataをモックする方法はありません。封印されたクラスの一部です。 – codette

答えて

0

私はユニットテストのエキスパートではありません。

アイデンティティコードはすでに孤立していると想定できるコードなので、ユニットテストでアイデンティティを模倣するのは難しいことではありませんか? (つまり、それはMicrosoftのコードですか?)たとえば、独自のコードを単体テストする場合、Frameworkオブジェクトの1つをモックアウトする必要はありません。リストやディクショナリを模倣する必要がありますか?

あなたが本当に孤立してコードをテストしたい、または何らかの理由でUserdataで返されたデータを超細かく制御したいのであれば、アイデンティティとコードのやりとりのためのインタフェースを書くことはできません?

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

質問を簡潔に保つための私の誤りです。しかし、私がテストしようとしている方法の中でプリンシパルIDがアクセスされているので、これは私のためには機能しません。しかし、私の方法の正しい部分をテストしていないのは正しい – codette