У меня проблема с определением, как и что тестировать.
У меня есть контроллер, который вводит UserManager
и вызывает метод CreateAsync
для создания нового пользователя.
Я не хочу тестировать диспетчер пользователей Identity, поскольку он уже был тщательно протестирован. Что я хотел бы сделать, так это проверить, что контроллер работает по правильным путям (в моем случае есть 3 пути, отправляющих ответы либо с ошибками состояния модели, либо с ошибками ответа идентичности, либо с простой строкой)
Должен ли я пытаться создать имитацию диспетчера пользователей, чтобы создать свой тест (я не уверен, как настроить диспетчер пользователей как фиктивную зависимость) Во-вторых, как я могу установить условия для проверки того, что контроллер принял заданный путь.
Я использую xUnit и Moq.
[Route("api/[controller]")]
public class MembershipController : BaseApiController
{
private UserManager<ApplicationUser> _userManager;
public MembershipController(UserManager<ApplicationUser> userManager)
{
_userManager = userManager;
}
[HttpGet("RegisterNewUser")]
public HttpResponseMessage RegisterNewUser([FromBody] NewUserRegistration user)
{
if (ModelState.IsValid)
{
ApplicationUser newUser = new ApplicationUser();
newUser.UserName = user.username;
newUser.Email = user.password;
IdentityResult result = _userManager.CreateAsync(newUser, user.password).Result;
if (result.Errors.Count() > 0)
{
var errors = new IdentityResultErrorResponse().returnResponseErrors(result.Errors);
return this.WebApiResponse(errors, HttpStatusCode.BadRequest);
}
}
else
{
var errors = new ViewModelResultErrorResponse().returnResponseErrors(ModelState);
return this.WebApiResponse(errors, HttpStatusCode.BadRequest);
}
return this.WebApiResponse(
"We have sent a valifation email to you, please click on the verify email account link.",
HttpStatusCode.OK);
}
}
В моем модульном тесте у меня есть следующее, чтобы проверить сценарий счастливого пути
[Fact]
public void RegisterNewUser_ReturnsHttpStatusOK_WhenValidModelPosted()
{
var mockStore = new Mock<IUserStore<ApplicationUser>>();
var mockUserManager = new Mock<UserManager<ApplicationUser>>(mockStore.Object, null, null, null, null, null, null, null, null);
ApplicationUser testUser = new ApplicationUser { UserName = "[email protected]" };
mockStore.Setup(x => x.CreateAsync(testUser, It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(IdentityResult.Success));
mockStore.Setup(x => x.FindByNameAsync(testUser.UserName, It.IsAny<CancellationToken>()))
.Returns(Task.FromResult(testUser));
mockUserManager.Setup(x => x.CreateAsync(testUser).Result).Returns(new IdentityResult());
MembershipController sut = new MembershipController(mockUserManager.Object);
var input = new NewUserInputBuilder().Build();
sut.RegisterNewUser(input);
}
Где «вход» в sut.RegisterNewUser (вход); относится к вспомогательному классу, который создает модель представления, которая требуется для действия контроллера:
public class NewUserInputBuilder
{
private string username { get; set; }
private string password { get; set; }
private string passwordConfirmation { get; set; }
private string firstname { get; set; }
private string lastname { get; set; }
internal NewUserInputBuilder()
{
this.username = "[email protected]";
this.password = "password";
this.passwordConfirmation = "password";
this.firstname = "user";
this.lastname = "name";
}
internal NewUserInputBuilder WithNoUsername()
{
this.username = "";
return this;
}
internal NewUserInputBuilder WithMisMatchedPasswordConfirmation()
{
this.passwordConfirmation = "MismatchedPassword";
return this;
}
internal NewUserRegistration Build()
{
return new NewUserRegistration
{ username = this.username, password = this.password,
passwordConfirmation = this.passwordConfirmation,
firstname = this.firstname, lastname = this.lastname
};
}
}
Моя цель здесь - вызвать 3 условия с помощью тестов:
- Создайте действительную модель просмотра и верните сообщение об успешном завершении.
- Создайте допустимую модель просмотра, но вернет ошибку IdentityResponse (например, пользователь существует), которая преобразуется в
- Создать недопустимую модель просмотра и вернуть ошибки Modelstate
Ошибки обрабатываются с помощью абстрактного класса, который возвращает объект json. Базовый класс для контроллера просто создает HttpResponseMessage
для возврата.
В основном я хочу проверить, что правильный класс ответа на ошибку вызывается путем принудительного выполнения теста по пути ошибки modelstate, пути identityresult.errors и что удачный путь может быть достигнут.
Затем я планирую изолированно протестировать классы ответов на ошибки.
Надеюсь, этого достаточно.
.Result
- person Nkosi   schedule 17.11.2017