Después de tanto batallar pudimos dar con el resultado de este dilema que agunos usuarios de este sitio web han tenido. Si tienes algún dato que compartir puedes compartir tu información.
Solución:
HttpContext.SignInAsync
es un método de extensión que utiliza RequestServices
cual es IServiceProvider
. Eso es lo que debes burlarte.
context.RequestServices
.GetRequiredService()
.SignInAsync(context, scheme, principal, properties);
Puede crear una simulación/falso manualmente mediante la creación de clases que se derivan de las interfaces utilizadas o utilizar un marco de simulación como Moq
//...code removed for brevity
var authServiceMock = new Mock();
authServiceMock
.Setup(_ => _.SignInAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny()))
.Returns(Task.FromResult((object)null));
var serviceProviderMock = new Mock();
serviceProviderMock
.Setup(_ => _.GetService(typeof(IAuthenticationService)))
.Returns(authServiceMock.Object);
var controller = new UserController(svc, null)
ControllerContext = new ControllerContext
HttpContext = new DefaultHttpContext
// How mock RequestServices?
RequestServices = serviceProviderMock.Object
;
//...code removed for brevity
Podrías fácilmente burlarte del HttpContext
así como las otras dependencias.
Puede leer sobre cómo usar Moq aquí en su Inicio rápido
En caso de que estén buscando un ejemplo de NSubstitue (Asp.net core).
IAuthenticationService authenticationService = Substitute.For();
authenticationService
.SignInAsync(Arg.Any(), Arg.Any(), Arg.Any(),
Arg.Any()).Returns(Task.FromResult((object) null));
var serviceProvider = Substitute.For();
var authSchemaProvider = Substitute.For();
var systemClock = Substitute.For();
authSchemaProvider.GetDefaultAuthenticateSchemeAsync().Returns(Task.FromResult
(new AuthenticationScheme("idp", "idp",
typeof(IAuthenticationHandler))));
serviceProvider.GetService(typeof(IAuthenticationService)).Returns(authenticationService);
serviceProvider.GetService(typeof(ISystemClock)).Returns(systemClock);
serviceProvider.GetService(typeof(IAuthenticationSchemeProvider)).Returns(authSchemaProvider);
context.RequestServices.Returns(serviceProvider);
// Your act goes here
// Your assert goes here
Si guardas alguna incertidumbre o forma de regenerar nuestro división te inspiramos añadir una reseña y con gusto lo leeremos.