Как создать IdentityResult с успехом == true
У меня есть класс с вложенным Microsoft.AspNet.Identity.UserManager, и я хочу ожидать, что метод userManager.CreateAsync(пользователь, пароль) вернет задание, в котором IdentityResult.Succeeded = true. Однако единственными доступными конструкторами для IdentityResult являются конструкторы отказов, которые приведут к тому, что свойство Succeeded будет false.
Как создать IdentityResult, который преуспел == true? IdentityResult не реализует интерфейс и Succeeded не является виртуальным, поэтому я не вижу каких-либо очевидных способов создания макетного объекта через Rhino Mocks (который я использую в качестве моей издевательской структуры).
Мой метод делает что-то вроде ниже. Предоставление этого примера, чтобы показать, почему я мог бы высмеять это.
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;
}
Я пытаюсь написать unit test, который гарантирует, что вызывается someOtherDependency.DoSomethingAmazing(), если identityResult.Succeeded is true. Спасибо за любую помощь!
Ответы
Ответ 1
Будет ли работать статическое свойство IdentityResult.Success? http://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult.success(v=vs.108).aspx
Edit:
Чтобы добавить более подробную информацию, вам кажется, что вы хотите, чтобы ваше издеваемое CreateAsync возвращало IdentityResult, где Suceeded is true. Для этого я просто вернул IdentityResult.Success из вашего макета. Не должно быть необходимости высмеивать сам IdentityResult.
Ответ 2
Чтобы свойство Succeeded, равное True, использовало один из следующих примеров:
return IdentityResult.Success;
IdentityResult result = IdentityResult.Success;
Ответ 3
Далее, чтобы свойство Success вернуло true
return Identity.Success;
Затем в вашем исполняющем коде вызовите метод реализации, подобный этому
var result = await RegisterUser(newUser).Result
if(result.Succeeded)
{
//do something
}
Ответ 4
Подход различен для Microsoft.AspNet.Identity и Microsoft.AspNetCore.Identity. Ниже я предоставил решения для обоих:
Если вы используете пространство имен Microsoft.AspNet.Identity, пожалуйста,
проверьте следующий подход:
В моем примере я издевался над IdentityResult.Success
следующим образом:
Во-первых, IdentityResult имеет защищенный конструктор:
protected IdentityResult(bool success);
Защищенный конструктор может быть доступен из унаследованного класса, если вы
реализовать так:
public class IdentityResultMock : IdentityResult
{
public IdentityResultMock(bool succeeded) : base(succeeded) { }
}
Во-вторых, в моем модульном тесте я настроил ResetPasswordAsync()
на
вернуть identityResult, как показано ниже:
var identityResult = new IdentityResultMock(true);
_mockUserManager.Setup(e => e.ResetPasswordAsync(user.Id, model.Code, model.Password)).ReturnsAsync(identityResult);
В-третьих, в моем контроллере действие ResetPasswordAsync()
вернется
результат с Successed == true
:
var result = await userManager.ResetPasswordAsync(user.Id, model.Code, model.Password);
В основном я реализовал новый класс, который унаследовал IdentityResult и
использовал это в моих тестовых случаях.
Если вы используете пространство имен Microsoft.AspNetCore.Identity
затем попробуйте следующий подход:
IdentityResult
в этом случае не имеет защищенного конструктора, но
имеет защищенное свойство Succeeded
, доступ к которому можно получить
класс, унаследовавший IdentityResult
.
Мы можем достичь, как в следующем примере:
public class IdentityResultMock : IdentityResult
{
public IdentityResultMock(bool succeeded = false)
{
this.Succeeded = succeeded;
}
}
var result = new IdentityResultMock(true);
Console.WriteLine(result.Succeeded);
result.Succeeded = true; // This is not allowed! Please use constructor.
Ответ 5
var responseTask = System.Threading.Tasks.Task.FromResult(IdentityResult.Success);
_mocAuthService.Stub(s => s.RegisterUser(null)).IgnoreArguments().Return(responseTask);
Если вам нужен успешный идентификатор IdentityResult, все, что вам нужно сделать, это вызвать свойство Success. Это даст вам успешный IdentityResult.
https://msdn.microsoft.com/en-us/library/microsoft.aspnet.identity.identityresult(v=vs.108).aspx