Я хочу выполнить модульное тестирование действия по созданию контроллера с внедрением зависимостей в объект 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.
Я не вижу, где Я делаю ошибку. Если вы можете мне помочь ...
Спасибо.