2013-12-09 3 views
9

Unit에 대해 ASP MVC 5 (Microsoft.AspNet.Identity)에서 User.Identity.GetUserId()를 어떻게 스터핑합니까? MVC5 컨트롤러의 테스트? GetUserId()는 확장이므로 직접 조롱 할 수는 없습니다. 그리고 테스트 전에 이드를 지정해야합니다. 클레임을 만들어 GenericIdentity에 할당해야하는 것 같습니다. 그러나 그것은 단위 테스트를 위해해야 ​​할 일처럼 보입니다. 어떤 대안이 있는지 아십니까?어떻게 MVC 5 (Microsoft.AspNet.Identity)의 User.Identity.GetUserId()를 스텁합니까?

+0

내 대답보기 : http : // stackoverflow.co.kr/a/39898952/2672291 – Haohmaru

답변

12

당신을 매우 감사 미스터 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; 
+0

각 혜택을 위해 작업 샘플을 공유해주십시오. 나는 또한 같은 라인에서 일하고있다. –

+0

IsAuthenticated가 여전히 거짓입니다.이 문제가 있습니까? – CularBytes

4

약간의 통증이 있으십니까?

사용중인 조롱 프레임 워크에 따라 크게 달라집니다. 당신이 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); 
     } 

, 그것은

0

당신은 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 부분도 테스트 할 수 있습니다 (신원의 유효성을 염려하는 경우).