2015-12-20 31 views
8

Sto scrivendo un'interfaccia utente per la gestione degli utenti in un'app ASP.NET 5. Devo mostrare eventuali errori restituiti da UserManager nell'interfaccia utente. Ho gli errori IdentityResult passati nel modello di visualizzazione ma sono un po 'alla deriva quando si tratta di testare il mio codice.Come mettere a tacere UserManager in ASP.NET 5

Qual è il modo migliore per simulare il UserManager in ASP.NET 5?

Devo ereditare da UserManager e ignorare tutti i metodi che sto utilizzando e quindi iniettare la mia versione di UserManager in un'istanza di Controller nel mio progetto di test?

+0

Avete trovato una soluzione per questo? Sto cercando di creare un test unitario per il mio controller account. – Jonathan

+0

Fondamentalmente ho deciso di aspettare il supporto xunit. – hally9k

risposta

16

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.

+0

Grazie per aver fornito il collegamento all'origine - nella mia applicazione, il tuo codice ha reso UserManager.GetUserAsync restituito nullo, ma dopo averlo ricostruito dall'esempio MusicStore l'ho ottenuto funzionante. :-) –