es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de burla: No se puede instanciar el proxy de la clase: Microsoft.AspNetCore.Identity.UserManager.

Estoy intentando crear una prueba de unidad utilizando Moq que pruebe el administrador de usuarios Microsoft.AspNetCore.Identity. Sé que Moq es bueno para simular interfaces, pero UserManager no tiene una interfaz.

Aquí está mi código:

Mock<><user>> userManagerMock = new Mock<><user>>();
// resto de mi código ...

Aquí está el error:

Castle.DynamicProxy.InvalidProxyConstructorArgumentsException: No se puede instanciar un proxy de la clase: Microsoft.AspNetCore.Identity.UserManager`1[[WebAPI.Core.Model.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]. No se pudo encontrar un constructor sin parámetros.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Dado que UserManager no tiene una interfaz, no podemos simularlo directamente usando Moq. Sin embargo, aún podemos crear una instancia probable de él creando una subclase de UserManager y anulando sus métodos. Aquí tienes un ejemplo de cómo se puede hacer esto:

    public class TestUserManager : UserManager<user>
    {
        public TestUserManager(IUserStore<user> store, IOptions<identityoptions> optionsAccessor,
            IPasswordHasher<user> passwordHasher, IEnumerable<><user>> userValidators,
            IEnumerable<><user>> passwordValidators, ILookupNormalizer keyNormalizer,
            IdentityErrorDescriber errors, IServiceProvider services, ILogger<><user>> logger)
            : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators,
            keyNormalizer, errors, services, logger)
        {
        }
    }
    
    // En tu prueba unitaria:
    Mock<><user>> userManagerMock = new Mock<testusermanager>(
        Mock.Of<><user>>(),
        Mock.Of<><identityoptions>>(),
        Mock.Of<><user>>(),
        new IUserValidator<user>[0],
        new IPasswordValidator<user>[0],
        Mock.Of<ilookupnormalizer>(),
        Mock.Of<identityerrordescriber>(),
        Mock.Of<iserviceprovider>(),
        Mock.Of<><><user>>>());
    

    En este ejemplo, creamos una subclase de UserManager llamada TestUserManager y pasamos los parámetros de su constructor al método Mock de Moq. Esto nos permite crear una instancia simulada de UserManager mientras aún tenemos acceso a todos sus métodos y funcionalidades.

    Ten en cuenta que pasamos instancias simuladas de las diversas dependencias de UserManager, como IUserStore, IOptions, IPasswordHasher y ILogger. Esto asegura que nuestra instancia de TestUserManager sea completamente funcional y se pueda utilizar en nuestra prueba unitaria.

    Una vez que tenemos nuestra instancia simulada de UserManager, podemos usar Moq para configurar el comportamiento deseado y probar nuestro código que depende de UserManager.

Comments are closed.