useridentity net name empty current asp asp.net .net unit-testing identity username

empty - Unidad de escritura Prueba de métodos que usan User.Identity.Name en ASP.NET Web API



httpcontext current user identity name is empty (8)

Aquí encontré la solución para otra forma de cómo configurar el nombre de identidad del usuario para la prueba de nivel del controlador desde el método de prueba.

public static void SetUserIdentityName(string userId) { IPrincipal principal = null; principal = new GenericPrincipal(new GenericIdentity(userId), new string[0]); Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } }

Estoy escribiendo casos de prueba usando Unit Test para ASP.NET Web API.

Ahora tengo una acción que hace una llamada a algún método que he definido en la capa de servicio, donde he utilizado la siguiente línea de código.

string username = User.Identity.Name; // do something with username // return something

Ahora, cómo crear el método de prueba unitaria para esto, obtengo excepciones de referencia nulas. Soy un poco nuevo para escribir pruebas unitarias y esas cosas.

Y quiero usar la prueba unitaria solo para esto.

Por favor, ayúdame en esto. Gracias.


Aquí hay otra forma que encontré en el tutorial de prueba NerdDinner . Funcionó en mi caso:

DinnersController CreateDinnersControllerAs(string userName) { var mock = new Mock<ControllerContext>(); mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName); mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true); var controller = CreateDinnersController(); controller.ControllerContext = mock.Object; return controller; } [TestMethod] public void EditAction_Should_Return_EditView_When_ValidOwner() { // Arrange var controller = CreateDinnersControllerAs("SomeUser"); // Act var result = controller.Edit(1) as ViewResult; // Assert Assert.IsInstanceOfType(result.ViewData.Model, typeof(DinnerFormViewModel)); }

Asegúrese de leer la sección completa: burlarse de la propiedad User.Identity.Name

Utiliza el marco de burla de Moq que puedes instalar en tu Test project usando NuGet: http://nuget.org/packages/moq


Con WebApi 5.0 esto es ligeramente diferente. Ahora puede hacer:

controller.User = new ClaimsPrincipal( new GenericPrincipal(new GenericIdentity("user"), null));


Cuando ejecuto la prueba de unidad, en mi caso utiliza la autenticación de Windows y la identidad. Nombre es mi nombre de dominio, que también quiero cambiar para la prueba. Así que uso este enfoque con ''piratear'' cosas que quiero en IAuthenticationFilter


El siguiente es solo una forma de hacer esto:

public class FooController : ApiController { public string Get() { return User.Identity.Name; } } public class FooTest { [Fact] public void Foo() { var identity = new GenericIdentity("tugberk"); Thread.CurrentPrincipal = new GenericPrincipal(identity, null); var controller = new FooController(); Assert.Equal(controller.Get(), identity.Name); } }


Esta es mi solución.

var claims = new List<Claim> { new Claim(ClaimTypes.Name, "Nikita"), new Claim(ClaimTypes.NameIdentifier, "1") }; var identity = new ClaimsIdentity(claims); IPrincipal user = new ClaimsPrincipal(identity); controller.User = user;


Nada de esto terminó trabajando para mí, utilicé la solución en otra pregunta que usa Moq para configurar un nombre de usuario en ControllerContext: https://.com/a/6752924/347455


Si tiene muchos Controladores para Probar, entonces GenericIdentity crear una clase base y en el constructor crear GenericIdentity & GenericPrincipal y establecer Thread.CurrentPrincipal

GenericPrincipal principal = new GenericPrincipal(new GenericIdentity("UserName"),null); Thread.CurrentPrincipal = principal;

Luego, hereda esa clase ... Entonces, de esa forma, cada clase de prueba unitaria tendrá un conjunto de objetos principales.

[TestClass] public class BaseUnitTest { public BaseUnitTest() { GenericPrincipal principal = new GenericPrincipal(new GenericIdentity("UserName"),null); Thread.CurrentPrincipal = principal; } } [TestClass] public class AdminUnitTest : BaseUnitTest { [TestMethod] public void Admin_Application_GetAppliction() { } }