0

Visual Studio 2010のビルトインテストツールとクラスライブラリ(article)を使用して、アカウント/ログオンアクションをテストして、偽のコントローラコンテキストを作成します。 私はテストメソッドを実行すると、このコード行:アカウント/ログオン操作のテスト

FormsAuthentication.SetAuthCookie(username, false);  

が例外をスロー:オブジェクト参照がloggonアクションをテストするには、オブジェクト

のインスタンスに設定されていない、私は私が作成すべきだと思いますクッキーコレクションを持つ偽のコントローラコンテキストを持つコントローラ。ここに私のテストコードブロックは次のとおりです。

AccountController controller = new AccountController(); 
    var cookies = new HttpCookieCollection(); 

    controller.ControllerContext = new FakeControllerContext(controller, cookies); 

    ActionResult result = controller.RemoteLogOn(username, password); 

答えて

9

私はこれが方法ですが、これは我々が何をすべきかであり、それが動作するかどうかはわかりません。

FormsAuthentication.SetAuthCookieを直接使用する代わりに、インターフェイスにそれを抽象化してください(例:IFormsAuthenticationService)。必要な場合

例えば、あなたのMVCコントローラのそれを受け入れる:あなたのユニットテストでその後

public AccountController(IFormsAuthenticationService formsAuthenticationService) 
{ 
    _formsAuthenticationService = formsAuthenticationService; // should use DI here 
} 

public ActionResult LogOn(string username, string pw) 
{ 
    if (yourLogicWhichChecksPw) 
     _formsAuthenticationService.SetAuthCookie(username, false); 
    return RedirectToAction("Index"); 
} 

を、アウト偽のインターフェイスにMoqのようなものを使用。ユニットテストフォーム認証に全く必要があるので、これをあざけるため

var username = "blah"; 
var pw = "blah"; 
var fakesFormsAuth = new Mock<IFormsAuthenticationService>(); 
fakeFormsAuth.Verify(x => x.SetAuthCookie(username, false), Times.AtLeastOnce());     
var controller = new AccountController(fakedFormsAuth.Object); 
controller.LogOn(username, pw); 

理由です。これは、ASP.NETフレームワークの組み込みで、よくテストされ、安定した部分です。だからこそ、基本的な実装を気にしないところで物事を模倣するのではなく、特定の条件(例外がスローされ、変数が設定されたなど)が満たされているかどうかテストするだけです。

.NETの仕組みではなく、独自のコードをテストしてください。

Stephen Waltherの記事では、テストで特定のコードがリクエスト内のデータを期待しているときに、RequestContextを偽造するための方法です。そのようなあなたは、次のコードのように、偽のコンテキストを必要な場所だなどUser.Identity、Request.IsAuthenticated、フォーム変数、など:

public ActionResult Save(SomeModel) 
{ 
    var user = Request.User.Identity; // this will be null, unless you fake the context. 
} 
+2

これは私が実際にできるものに来て最も近いです私は昨日SetAuthCookieを模倣する方法を探し始めたので理解しています。ありがとう。 – dartacus

関連する問題