2014-10-09 31 views
16

Mam klasy z Microsoft.AspNet.Identity.UserManager wstrzyknięty, i chcę oczekiwać metody userManager.CreateAsync (użytkownik, hasło), aby zwrócić zadanie, w którym IdentityResult.Succeeded = true. Jednak jedynymi dostępnymi konstruktorami dla IdentityResult są konstruktory błędów, które spowodują, że właściwość Succeeded będzie fałszywa.Jak zbudować IdentityResult z sukcesem == true

Jak utworzyć IdentityResult, który powiodło się == true? IdentityResult nie implementuje interfejsu, a funkcja Succeeded nie jest wirtualna, więc nie widzę żadnych oczywistych sposobów tworzenia pozorowanego obiektu za pomocą Rhino Mocks (którego używam jako mojej szyderczej architektury).

Moja metoda robi coś jak poniżej. Podając ten przykład, aby pokazać, dlaczego mógłbym drwić z tego.

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; 
    } 

Próbuję napisać badanej jednostki, która zapewnia, że ​​someOtherDependency.DoSomethingAmazing() jest wywoływana jeśli identityResult.Succeeded jest prawdą. Dzięki za pomoc!

+0

Brzmi jak sprawa dekoratora (http://en.wikipedia.org/wiki/Decorator_pattern). –

+0

Tak, naprawdę chciałem to zarezerwować w ostateczności. Istnieje wiele metod, które zwracają IdentityResult, więc trudno byłoby zawijać wszystkie te ... ale może po prostu muszę. – jakejgordon

+0

Jak wspomniano @jaytre, użyj var result = IdentityResult.Success da ci obiekt IdentityResult z Succeeded = true –

Odpowiedz

27

Czy statyczna właściwość IdentityResult.Success zadziała? http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx

Edit: Aby dodać trochę więcej szczegółów, wydaje się, co chcesz zrobić, to Twój szydzili CreateAsync do zwracania IdentityResult gdzie suceeded jest prawdą. W tym celu po prostu zwrócę IdentityResult.Success z twojej sztuczki. Nie powinno być potrzeby kpić z samego IdentityResult.

+0

Co dokładnie sugerujesz tutaj? Muszę wymusić wartość Sukces, aby była prawdziwa dla mojego testu. – jakejgordon

+0

Może się mylę z tym, co chcesz zrobić, ale wyśmiewałbym CreateAsync, aby zwrócić IdentityResult.Success. Nie wydaje mi się, żeby istniała potrzeba wyśmiewania się z IdentityResult. Po prostu CreateAsync, aby zapewnić funkcjonalność, której się spodziewasz. – jt000

+2

Ach, źle zrozumiałem, co to było. Właściwość statyczna zwraca właściwość IdentityResult, która się powiodła. Dziwne. W każdym razie to jest dokładnie to, czego potrzebuję. Dzięki! – jakejgordon

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

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

Jeśli potrzebujesz udanego IdentityResult, wszystko, co musisz zrobić, to zadzwonić do właściwości Success. To da ci udany IdentityResult.

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

+0

Czy możesz podać kontekst dla odpowiedzi? Kod jest dobry, ale wyjaśnienie kodu jest jeszcze lepsze. –

+0

Zaktualizowano odpowiedź komentarzem, mam nadzieję, że sprawi, że będzie wyraźniejszy – kingkeamo

9

Aby uczynić Następca nieruchomość równa True stosowania obu tych przykładach:

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

Co więcej, aby uczynić nieruchomość Sukces zwraca true

return Identity.Success; 

Następnie w zaimplementuj kod, zadzwoń do takiej metody implementacji:

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

W moim przykładzie wyśmiałem IdentityResult.Sukces w następujący sposób:

Najpierw IdentityResult jest chroniony konstruktora:

protected IdentityResult(bool success); 

Protected konstruktor można uzyskać z dziedziczonej klasie jeśli wdrożenie tak:

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

drugie, w moim badanej jednostki Skonfigurowałem ResetPasswordAsync(), aby zwrócić identityResult jak poniżej:

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

trzecie, w działaniu mojego sterownika ResetPasswordAsync() spowoduje powraca z successed == true:

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

Zasadniczo I wdrożone nowe klasy, które dziedziczone IdentityResult i używane, że w moich testów.

Powiązane problemy