web-dev-qa-db-ja.com

FormsAuthenticationを使用するASP.NETMVCコントローラーを単体テストするにはどうすればよいですか?

テスト駆動方式でASP.NETMVCソリューションを使用しており、フォーム認証を使用してユーザーをアプリケーションにログインさせたいと考えています。コントローラーに入れたいコードは次のようになります。

FormsAuthentication.SetAuthCookie(userName, false);

私の質問は、このコードを正当化するためのテストをどのように書くのですか?

SetAuthCookieメソッドが正しいパラメーターで呼び出されたことを確認する方法はありますか?

偽の/模擬FormsAuthenticationを注入する方法はありますか?

47
maz

まず、このロジックをカプセル化するインターフェイスとラッパークラスを作成してから、コントローラーでインターフェイスを使用します。

public interface IAuth 
{
    void DoAuth(string userName, bool remember);
}

public class FormsAuthWrapper : IAuth 
{
    public void DoAuth(string userName, bool remember) 
    {
        FormsAuthentication.SetAuthCookie(userName, remember);
    }
}

public class MyController : Controller 
{
    private readonly IAuth _auth;

    public MyController(IAuth auth) 
    {
        _auth = auth;
    }

}

これで、IAuthは単体テストで簡単にモックされ、コントローラーが期待されるメソッドを呼び出すことを確認できます。 FormsAuthWrapperクラスは、本来の機能を実行するFormsAuthenticationに呼び出しを委任するだけなので、単体テストは行いません(Microsoftの保証:-))。

68
Darin Dimitrov