2014-10-09 68 views
16

Ho una classe con Microsoft.AspNet.Identity.UserManager iniettato, e mi aspetto il metodo userManager.CreateAsync (utente, password) per restituire un'attività in cui IdentityResult.Succeeded = vero Tuttavia, gli unici costruttori disponibili per IdentityResult sono i costruttori di errori che causeranno la proprietà Succeeded come false.Come costruire IdentityResult con successo == true

Come si crea un IdentityResult che è riuscito == true? IdentityResult non implementa un'interfaccia e Succeeded non è virtuale, quindi non vedo alcun modo ovvio di creare un oggetto mock attraverso Rhino Mocks (che sto usando come framework di simulazione).

Il mio metodo è simile al seguente. Fornire questo esempio per mostrare perché potrei voler deridere questo.

public async Task<IdentityResult> RegisterUser(NewUser newUser) 
    { 
     ApplicationUser newApplicationUser = new ApplicationUser() 
     { 
      UserName = newUser.UserName, 
      Email = newUser.Email 
     }; 

     IdentityResult identityResult = await applicationUserManager.CreateAsync(newApplicationUser, newUser.Password); 

     if(identityResult.Succeeded) 
     { 
      someOtherDependency.DoSomethingAmazing(); 
     } 

     return identityResult; 
    } 

che sto cercando di scrivere uno unit test che assicura che someOtherDependency.DoSomethingAmazing() viene chiamato se identityResult.Succeeded è vero. Grazie per qualsiasi aiuto!

+0

Sembra un caso per un decoratore (http://en.wikipedia.org/wiki/Decorator_pattern). –

+0

Sì, stavo davvero cercando di riservarlo come ultima risorsa. Esistono numerosi metodi che restituiscono IdentityResult, quindi sarebbe un problema avvolgere tutti questi ... ma potrei doverlo fare. – jakejgordon

+0

Come @jaytre menzionato, usa var result = IdentityResult.Success ti darà un oggetto IdentityResult con Riuscito = true –

risposta

27

La proprietà statica IdentityResult.Success funzionerà? http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx

Edit: Per aggiungere un po 'più in dettaglio, a quanto pare ciò che si vuole fare è ottenere il vostro deriso CreateAsync per restituire un IdentityResult dove Suceeded è vero. Per questo vorrei solo restituire IdentityResult.Success dal tuo finto. Non c'è bisogno di prendere in giro IdentityResult stesso.

+0

Che cosa stai suggerendo esattamente qui? Devo forzare il valore Success per essere vero per il mio test. – jakejgordon

+0

Forse mi sto sbagliando con quello che vuoi fare, ma creo CreateAsync per restituire IdentityResult.Success. Non penso che ci sia bisogno di prendere in giro IdentityResult. Basta CreateAsync per fornire la funzionalità che ti aspetti. – jt000

+2

Ah, ho frainteso quello che era. La proprietà statica restituisce effettivamente un IdentityResult che ha esito positivo. Strano. Ad ogni modo, è proprio quello di cui ho bisogno. Grazie! – jakejgordon

1
var responseTask = System.Threading.Tasks.Task.FromResult(IdentityResult.Success); 

_mocAuthService.Stub(s => s.RegisterUser(null)).IgnoreArguments().Return(responseTask); 

Se avete bisogno di un IdentityResult successo, allora tutto quello che dovete fare è chiamare la proprietà Success. Questo ti darà un IdentityResult di successo.

https://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult(v=vs.108).aspx

+0

Potresti fornire un contesto per la risposta? Il codice è buono, ma una spiegazione del codice è ancora migliore. –

+0

Aggiornato la risposta con un commento, si spera lo renderà più chiaro – kingkeamo

9

Per rendere la proprietà Riuscito uguale a True uso uno di questi esempi:

return IdentityResult.Success; 
IdentityResult result = IdentityResult.Success; 
1

ulteriormente più, per rendere la proprietà successo restituisce true

return Identity.Success; 

Poi, nel tuo implementando il codice, chiama il metodo di implementazione come questo

var result = await RegisterUser(newUser).Result 
if(result.Succeeded) 
{ 
    //do something 
} 
0

Nel mio esempio ho deriso IdentityResult.Il successo nel modo seguente:

costruttore In primo luogo, IdentityResult ha protetto:

protected IdentityResult(bool success); 

costruttore protetta si può accedere da classe ereditata se si implementa in questo modo:

public class IdentityResultMock : IdentityResult 
    { 
     public IdentityResultMock(bool succeeded) : base(succeeded) { } 
    } 

In secondo luogo, nel mio test di unità Ho configurato ResetPasswordAsync() per restituire identityResult come in seguito:

var identityResult = new IdentityResultMock(true); 
_mockUserManager.Setup(e => e.ResetPasswordAsync(user.Id, model.Code, model.Password)).ReturnsAsync(identityResult); 

In terzo luogo, l'azione di mio controller ResetPasswordAsync() si restituisce il risultato con Successed == true:

var result = await userManager.ResetPasswordAsync(user.Id, model.Code, model.Password); 

Fondamentalmente ho implementato nuova classe che ha ereditato IdentityResult e utilizzato che nei miei casi di test.

Problemi correlati