これが正しい方法かどうかはわかりませんが、これが私たちが行っていることであり、機能しています。
を直接使用する代わりに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.
}