나는 이것이 바로 방법입니다 있는지 확실하지 않습니다, 그러나 이것은 우리가하는 일이며, 그것은 작동합니다.
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