ClaimsPrincipal.Current에서 정보를 가져 오는 컨트롤러 코드를 단위 테스트하려고합니다. 컨트롤러 코드에서 내가mock에 클레임을 추가하는 방법 ClaimsPrincipal
public class HomeController {
public ActionResult GetName() {
return Content(ClaimsPrincipal.Current.FindFirst("name").Value);
}
}
그리고 주장과 함께 내 ClaimsPrincipal을 조롱하려고하지만, 난 여전히 주장에서 어떤 모의 값이 없습니다.
// Arrange
IList<Claim> claimCollection = new List<Claim>
{
new Claim("name", "John Doe")
};
var identityMock = new Mock<ClaimsIdentity>();
identityMock.Setup(x => x.Claims).Returns(claimCollection);
var cp = new Mock<ClaimsPrincipal>();
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>())).Returns(true);
cp.Setup(m => m.Identity).Returns(identityMock.Object);
var sut = new HomeController();
var contextMock = new Mock<HttpContextBase>();
contextMock.Setup(ctx => ctx.User).Returns(cp.Object);
var controllerContextMock = new Mock<ControllerContext>();
controllerContextMock.Setup(con => con.HttpContext).Returns(contextMock.Object);
controllerContextMock.Setup(con => con.HttpContext.User).Returns(cp.Object);
sut.ControllerContext = controllerContextMock.Object;
// Act
var viewresult = sut.GetName() as ContentResult;
// Assert
Assert.That(viewresult.Content, Is.EqualTo("John Doe"));
단위 테스트를 실행하면 viewresult.Content가 비어 있습니다. 모의 주장을 추가 할 수 있다면 도움이됩니다. 감사.
고마워요! 나는 그것을 복잡하게 만들고 있다고 생각한다. 언제 우리는 실제로'ClaimsPrincipal'을 조롱해야합니까? Google에서 확인한 이후 많은 사람들이'ClaimsPrincipal'을 조롱하고 있습니다. 이런, http://stackoverflow.com/questions/14190066/is-there-any-way-i-can-mock-a-claims-principal-in-my-asp-net-mvc-web-application. – Henry
당신은 환영합니다 :) 그 대답은 SUT가 HasClaim 메소드만을 호출 할 것이라는 가정은 너무 연약합니다. SUT (아마도 제 3 자 코드)가 교장의 추가 구성원을 액세스해야하는 경우 테스트가 중단됩니다. 필자는 종종 의존성을 수동으로 서브 클래 싱하여 "테스트 방법"으로 구현하는 것을 선호하지만 여전히 일관성있게 작동하는지 확인합니다. –
Brilliant! 나를 위해 완벽하게 일했습니다. 고맙습니다! –