0

Visual Studio 2010 の組み込みテスト ツールとこの記事のクラス ライブラリを使用して Account/Loggon アクションをテストし、偽のコントローラー コンテキストを作成します。テスト メソッドを実行すると、次のコード行が表示されます。

  FormsAuthentication.SetAuthCookie(username, false);    

例外をスローします:オブジェクト参照がオブジェクトのインスタンスに設定されていません

loggon アクションをテストするには、Cookie コレクションを持つ偽のコントローラー コンテキストを使用してコントローラーを作成する必要があると思います。これが私のテストコードブロックです:

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

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

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

1 に答える 1

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 の記事に関しては、テストで特定のコードが Request 内のデータを予期している場合に、RequestContext を偽造するためのものです。User.Identity、Request.IsAuthenticated、Form 変数など。次のコードのように、コンテキストを偽造する必要がある場所です。

public ActionResult Save(SomeModel)
{
   var user = Request.User.Identity; // this will be null, unless you fake the context.
}
于 2012-03-12T05:43:35.047 に答える