L'ho gestito con l'aiuto dell'applicazione di esempio MVC Music Store.
nella mia unità di classe di prova, ho creato il contesto di database e UserManager come questo:
public class DatabaseSetupTests : IDisposable
{
private MyDbContext Context { get; }
private UserManager<ApplicationUser> UserManager { get; }
public DatabaseSetupTests()
{
var services = new ServiceCollection();
services.AddEntityFramework()
.AddInMemoryDatabase()
.AddDbContext<MyDbContext>(options => options.UseInMemoryDatabase());
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<MyDbContext>();
// Taken from https://github.com/aspnet/MusicStore/blob/dev/test/MusicStore.Test/ManageControllerTest.cs (and modified)
// IHttpContextAccessor is required for SignInManager, and UserManager
var context = new DefaultHttpContext();
context.Features.Set<IHttpAuthenticationFeature>(new HttpAuthenticationFeature());
services.AddSingleton<IHttpContextAccessor>(h => new HttpContextAccessor { HttpContext = context });
var serviceProvider = services.BuildServiceProvider();
Context = serviceProvider.GetRequiredService<MyDbContext>();
UserManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
}
....
}
allora posso usare l'UserManager nel mio test di unità, ad esempio:
[Fact]
public async Task DontCreateAdminUserWhenOtherAdminsPresent()
{
await UserManager.CreateAsync(new ApplicationUser { UserName = "[email protected]" }, "IDoComplyWithTheRules2016!");
...
}
Se il tuo Dependency Injector non è in grado di risolvere un IHttpContextAccessor, quindi non sarai in grado di creare un'istanza UserManager perché dipende da esso. Penso (e questo è solo un presupposto), che con Asp.Net 5, l'UserManager si occupa di aggiornare le affermazioni basate sui cookie quando le si cambia (rivendicazioni, ruoli ...) per un utente e quindi richiede alcuni HttpContext per azioni di accesso/disconnessione e accesso ai cookie.
Avete trovato una soluzione per questo? Sto cercando di creare un test unitario per il mio controller account. – Jonathan
Fondamentalmente ho deciso di aspettare il supporto xunit. – hally9k