Как создать 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. Ниже я предоставил решения для обоих:

  1. Если вы используете пространство имен 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 и использовал это в моих тестовых случаях.

  2. Если вы используете пространство имен 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