1

次のメソッドを使用してインターフェイスを作成しました。

Public Interface IAuthenticationService
    Sub SetAuthentication(ByVal username As String)
    Sub Logout()
    Function IsLoggedIn() As Boolean
End Interface

私の実装は次のようになります。

Public Class Authentication
    Implements IAuthenticationService
    Public Sub Logout() Implements IAuthenticationService.Logout
        FormsAuthentication.SignOut()
        LoggedIn = False
    End Sub

    Public Sub SetAuthentication(ByVal username As String) Implements IAuthenticationService.SetAuthentication
        FormsAuthentication.SetAuthCookie(username, True)
        LoggedIn = True
    End Sub

    Public Function IsLoggedIn() As Boolean Implements IAuthenticationService.IsLoggedIn
        If LoggedIn Then Return True
        Return False
    End Function

    Private _isLoggedIn As Boolean = false
    Public Property LoggedIn() As Boolean
        Get
            Return _isLoggedIn
        End Get
        Set(ByVal value As Boolean)
            _isLoggedIn = value
        End Set
    End Property
End Class

私のコントローラ クラスには、FormsAuthentication にチケットを設定するアクションがあります。

    Public Function Login(ByVal username As String, ByVal password As String) As ActionResult

       _authenticationService.SetAuthentication(username)
        Return View()
    End Function

私の質問は、認証サービス クラスで FormsAuthentication をテストする方法です。テストを書くために Xunit/Moq を使用しています。アクションを呼び出すと、「System.NullReferenceException : オブジェクト参照がオブジェクトのインスタンスに設定されていません」というメッセージが表示され、FormsAuthentication オブジェクトが Null であるため、認証チケットを設定できないことがわかります。これを解決するための最良の解決策は何ですか。いくつかのコード例や、インスピレーションを得ることができる場所への参照があればうれしいです。特に解決策が嘲笑されている場合...

4

1 に答える 1

3

このような FormsAuthentication クラスの周りにラッパー クラスを作成します...

Public Interface IFormsAuthentication
    Sub SignIn(ByVal userName As String, ByVal createPersistentCookie As Bool) 
    Sub SignOut() 
End Interface 


Public Class FormsAuthenticationWrapper Implements IFormsAuthentication  

    Public Sub SignIn(ByVal userName As String, ByVal createPersistentCookie As Bool) Implements IFormsAuthentication.SignIn  
        FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    End Sub  

    Public Sub SignOut() Implements IFormsAuthentication.SignOut  
        FormsAuthentication.SignOut()  
    End Sub  

End Class 

次に、(コンストラクターを介して) IFormsAuthentication を依存関係として Authentication クラスに渡すことができます。これにより、単体テストを作成するときに IFormsAuthentication 呼び出しをモックできます。:-)

于 2010-02-15T15:33:27.450 に答える