Проблема с модульным тестом MSTest для контроллера с внедрением зависимости IDataProtector - PullRequest
0 голосов
/ 04 апреля 2020

Я хочу выполнить модульное тестирование действия по созданию контроллера с внедрением зависимостей в объект IDataProtector. Ошибка состоит в том, что объект IDataProtector остается нулевым в этом тесте (System.ArgumentNullException: значение не может быть нулевым. (Параметр 'protector')).

Код действия контроллера выглядит следующим образом:

    public class FiliacionesController : ControllerBase
{
    // Propiedades
    private readonly IRepositorioIncidencias _incidenciaService;
    private readonly IDataProtector _protector;
    private readonly IMapper _mapper;

    // Constructor
    public FiliacionesController(IRepositorioIncidencias incidenciaService, IDataProtectionProvider protectionProvider, IMapper mapper)
    {
        _incidenciaService = incidenciaService; 
        _protector = protectionProvider.CreateProtector("xxxxxxxxx"); 
        _mapper = mapper;
    }
    // Método
    public async Task<ActionResult> Post([FromBody] FiliacionDTO_Post _filiacion)
    {
        // Encriptación de campos de la filiación            
        var domicilioCript = "";
        var telefonoCript = "";
        var nombreCript = _protector.Protect(_filiacion.Nombre);           
        if(!String.IsNullOrEmpty(_filiacion.Direccion))
        {
            domicilioCript = _protector.Protect(_filiacion.Direccion);
        }
        if(!String.IsNullOrEmpty(_filiacion.Telefono))
        {
            telefonoCript = _protector.Protect(_filiacion.Telefono);
        }     

        // actualizamos los campos con los datos encriptados
        _filiacion.Nombre = nombreCript;
        if (!String.IsNullOrEmpty(domicilioCript))
        {
            _filiacion.Direccion = domicilioCript;
        }
        if (!String.IsNullOrEmpty(telefonoCript))
        {
            _filiacion.Telefono = telefonoCript;
        }

        var filiacion = _mapper.Map<Filiacion>(_filiacion);

        // Insertamos filiación
        var resultado = await _incidenciaService.AddFiliacion(filiacion);
        if (resultado)
        {
            return new CreatedAtRouteResult("ObtenerFiliacion", new { id = filiacion.Id_Filiacion }, filiacion);
        }
        else
        {                    
            return BadRequest();
        }   
    }

Код модульного теста выглядит следующим образом:

[TestClass]
    public class SeguridadControllersTest
    {
        // inyeccion de dependencias
        Mock<IRepositorioIncidencias> mock;           
        Mock<IDataProtectionProvider> protectionProvider;
        MapperConfiguration mockMapper;

        // Constructor
        public SeguridadControllersTest()
        {
            this.mock = new Mock<IRepositorioIncidencias>();
            this.protector = new Mock<IDataProtector>();
            this.protectionProvider = new Mock<IDataProtectionProvider>();
            this.mockMapper = new MapperConfiguration(config =>
            {
                config.AddProfile(new IncidenciasMappingProfile());
            });
        }

        // Método
        [TestMethod]
        public async Task Post_CrearFiliacion_OK()
        {
            #region Arrange

            var filiacionDTO = new FiliacionDTO_Post()
            {
                Nombre = "Nombre Filiacion",
                Dni = "12345678A",
                Pasaporte = null,
                Fecha_nac = Convert.ToDateTime("08/01/1985"),
                Lugar_nac = "Lugar nacimiento",
                Direccion = "Direccion",
                Poblacion = "Población",
                Provincia = "Provincia",
                Pais = "Pais",
                Observaciones = null,
                Telefono = "666123123"
            };
            mock.Setup(x => x.AddFiliacion(It.IsAny<Filiacion>())).ReturnsAsync(true);            
            var mapper = mockMapper.CreateMapper();            
            var controladorFiliaciones = new FiliacionesController(mock.Object, protectionProvider.Object, mapper);
            #endregion

            #region Act

            var resultado = await controladorFiliaciones.Post(filiacionDTO);
            #endregion

            #region Assert

            Assert.IsInstanceOfType(resultado, typeof(CreatedAtRouteResult));
            mock.Verify(x => x.AddFiliacion(It.IsAny<Filiacion>()));
            #endregion
        }
    }

Строка кода, которая выдает исключение, находится в обработчике (var crypname = _protector.Protect (_filiacion.nombre);), и это потому что "_protector" остается нулевым. Делая трассировку в отладке Я наблюдаю, как аргументы конструктора контроллера получают значения правильно, проблема в том, что в конструкторе _protector он не соответствует конфигурации объекта IDataProviderProtection.

Я не вижу, где Я делаю ошибку. Если вы можете мне помочь ...

Спасибо.

...