Unit에 대해 ASP MVC 5 (Microsoft.AspNet.Identity)에서 User.Identity.GetUserId()를 어떻게 스터핑합니까? MVC5 컨트롤러의 테스트? GetUserId()는 확장이므로 직접 조롱 할 수는 없습니다. 그리고 테스트 전에 이드를 지정해야합니다. 클레임을 만들어 GenericIdentity에 할당해야하는 것 같습니다. 그러나 그것은 단위 테스트를 위해해야 할 일처럼 보입니다. 어떤 대안이 있는지 아십니까?어떻게 MVC 5 (Microsoft.AspNet.Identity)의 User.Identity.GetUserId()를 스텁합니까?
답변
당신을 매우 감사 미스터 T.
HTH 될 필요가 없습니다 아이디어에 대한 많은 것. NSubstitute를 사용하고 있습니다. 나는 Microsoft Fakes도 JustMock도 없다. 그래서 나는 내가 사용자 아이디의 값을 제어 할 수있는 GenericIdentity에 직접 먹거리 주장을 종료 :
string username = "username";
string userid = Guid.NewGuid().ToString("N"); //could be a constant
List<Claim> claims = new List<Claim>{
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", username),
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", userid)
};
var genericIdentity = new GenericIdentity("");
genericIdentity.AddClaims(claims);
var genericPrincipal = new GenericPrincipal(genericIdentity, new string[] { "Asegurado" });
controllerContext.HttpContext.User = genericPrincipal;
각 혜택을 위해 작업 샘플을 공유해주십시오. 나는 또한 같은 라인에서 일하고있다. –
IsAuthenticated가 여전히 거짓입니다.이 문제가 있습니까? – CularBytes
약간의 통증이 있으십니까?
사용중인 조롱 프레임 워크에 따라 크게 달라집니다. 당신이 Moq를 사용하고 있다는 나의 가정을 토대로, Moq은이 일을 훌륭하게 수행하지 않기 때문에 다소 운이 좋을 것입니다. 그 이유는 Moq이 확장 메소드를 모의 할 수 없다는 것입니다. (실제로는 can이긴하지만 원하지 않아야합니다 :-))
JustMock과 같은 다른 조롱 프레임 워크를 사용하는 경우, 다르다. this에 따르면, 따라야 할 것보다 더 쉽게 볼 수 있습니다.
(쉬운에서 멀리 아직도) 내가 찾은 가장 쉬운 방법은 Microsoft Fakes
이 새로운 정체성 물건의 대부분은 확장 인터페이스를 사용하여 작성 사용하는 것입니다. 나는 그들이 왜 이것이 좋은 생각 일지 생각했지만 왜 그랬는지 알 수 없다.
다음은 수행해야 할 작업입니다.
Microsoft.AspNet.Identity
에 대한 가짜 어셈블리를 만드는 것으로 시작하십시오. 어셈블리를 마우스 오른쪽 버튼으로 클릭하고 'Fake 어셈블리 추가'를 선택하면됩니다. 이것은 본질적으로 조립품을 걷고 거기서 발견되는 모든 것에 대해 심과 스텁을 생성합니다. 당신이하고 싶은 일은 GetUserId
에 대한 호출을 심의하는 것입니다. 실제로는 그렇게 어렵지 않습니다.
그럼 당신은 꽤 익숙한 소리로 ControllerContext
의 일반적인 조롱을해야합니다.
다음 코드는 당신은 내가 생각 찾고있는 무엇을 할 것인가 - 물론
using (var context = ShimsContext.Create())
{
Microsoft.AspNet.Identity.Fakes
.ShimIdentityExtensions.GetUserIdIIdentity =
(i) => "Mr. T";
var fakeHttpContext = new Mock<HttpContextBase>();
var fakeIdentity = new GenericIdentity("User");
var principal = new GenericPrincipal(fakeIdentity, null);
fakeHttpContext.Setup(t => t.User).Returns(principal);
var controllerContext = new Mock<ControllerContext>();
controllerContext.Setup(t => t.HttpContext)
.Returns(fakeHttpContext.Object);
var sut = new HomeController();
sut.ControllerContext = controllerContext.Object;
var result = sut.YourTestAction();
Assert.True(result.WhatYouCareAbout);
}
, 그것은
당신은 MvcContrib.TestHelper.Fakes의 개체에서 상속 가짜 원금 및/또는 정체성을 만들 수
using System.Collections.Generic;
using System.Security.Claims;
using MvcContrib.TestHelper.Fakes;
namespace Tests.Unit.Fakes
{
public class FakeClaimIdentity : ClaimsIdentity
{
private readonly FakeIdentity _fakeIdentity;
public FakeClaimIdentity(string id, string userName) : base(userName)
{
_fakeIdentity = new FakeIdentity(userName);
base.AddClaims(new List<Claim>
{
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name", userName),
new Claim("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", id)
});
}
public override bool IsAuthenticated
{
get { return _fakeIdentity.IsAuthenticated; }
}
public override string Name
{
get { return _fakeIdentity.Name; }
}
public override string AuthenticationType
{
get
{
return _fakeIdentity.AuthenticationType;
}
}
}
}
:
using (var userManager = _userManagerFactory.CreateUserManager())
{
var userId = Guid.NewGuid().ToString();
var result = userManager.CreateAsync(new IdentityUser() { Id = userId, UserName = "userName" }, "password").Result;
Assert.IsTrue(result.Succeeded, "failed to create user through usermanager");
var fakePrincipal = new FakePrincipal(new FakeClaimIdentity(userId, "userName"), new[] { "SomeRole" });
Assert.IsTrue(fakePrincipal.Identity.IsAuthenticated, "fake user did not come back authenticated");
}
나는 그 가짜 주장 신원을 확인하는 데 사용되는 클래스는 이것이다 :
그런 다음 당신은 이런 식으로 뭔가를 할 수
이렇게하면 IsAuthenticated 부분도 테스트 할 수 있습니다 (신원의 유효성을 염려하는 경우).
내 대답보기 : http : // stackoverflow.co.kr/a/39898952/2672291 – Haohmaru