私はこれが右方法ですが、これは我々が何をすべきかであり、それが動作するかどうかはわかりません。
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.
}
これは私が実際にできるものに来て最も近いです私は昨日SetAuthCookieを模倣する方法を探し始めたので理解しています。ありがとう。 – dartacus