Tôi gặp sự cố khi tìm hiểu cách thực hiện và thử nghiệm.Hành động của bộ điều khiển kiểm tra đơn vị Asp.net Core Identity
Tôi có bộ điều khiển tiêm UserManager
và gọi phương thức CreateAsync
để tạo người dùng mới.
Tôi không muốn kiểm tra Trình quản lý người dùng danh tính vì điều này đã được kiểm tra kỹ lưỡng một cách rõ ràng. Những gì tôi muốn làm là kiểm tra xem bộ điều khiển có chạy đúng đường dẫn hay không (trong trường hợp của tôi, có 3 đường dẫn, gửi phản hồi trở lại với lỗi trạng thái mô hình, lỗi phản hồi danh tính hoặc chuỗi đơn giản)
Tôi có nên cố gắng tạo mô hình quản lý người dùng để tạo thử nghiệm của tôi (Tôi không chắc chắn cách thiết lập trình quản lý người dùng làm phụ thuộc giả) Thứ hai, làm cách nào để tôi có thể đặt điều kiện để xác minh rằng trình điều khiển đã thực hiện một đường dẫn nhất định .
Tôi đang sử dụng xUnit và 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);
}
}
Trong thử nghiệm đơn vị của tôi, tôi đã phần sau đây để kiểm tra một con đường hạnh phúc kịch bản
[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);
}
đâu "đầu vào" trong sut.RegisterNewUser (đầu vào); dùng để chỉ một lớp helper mà xây dựng viewmodel mà hành động điều khiển yêu cầu:
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
};
}
}
tôi nhằm mục đích ở đây là để buộc 3 điều kiện thông qua các bài kiểm tra:
- Tạo một viewmodel hợp lệ và trả về một thông báo thành công
- Tạo chế độ xem hợp lệ nhưng trả về lỗi IdentityResponse (ví dụ: người dùng tồn tại) được chuyển đổi thành
- Tạo chế độ xem không hợp lệ và trả về Lỗi mô hình
Các lỗi được xử lý bằng cách sử dụng lớp trừu tượng trả về đối tượng json Lớp cơ sở cho bộ điều khiển chỉ đơn giản là xây dựng một HttpResponseMessage
để trả về.
Về cơ bản tôi muốn kiểm tra xem lớp phản hồi lỗi chính xác có được gọi bằng cách buộc kiểm tra xuống đường dẫn lỗi mô hình, đường dẫn identresult.errors và đường dẫn hạnh phúc có thể đạt được hay không.
Sau đó, kế hoạch của tôi là kiểm tra các lớp phản hồi lỗi một cách riêng biệt.
Hy vọng rằng đó là đủ chi tiết.
Mặc dù nó sẽ yêu cầu một số tái cấu trúc, hãy xem câu trả lời tôi đã cung cấp ở đây https://stackoverflow.com/questions/41883635/how-to-use-di-with-usermanager-and-userstore/41885293#41885293 . Một vài mẹo nhanh khi nói đến chế giễu. Đừng chế giễu những gì bạn không sở hữu. Các lớp nên phụ thuộc vào trừu tượng và không phụ thuộc. – Nkosi
Cảm ơn câu trả lời của bạn. Tôi vẫn không thực sự chắc chắn về cách kiểm tra mã của tôi mặc dù. Tôi đang tìm kiếm một câu trả lời hoàn chỉnh hơn một chút. –
Vậy thì tôi khuyên bạn nên bắt đầu bằng cách thử một cái gì đó. Nếu bạn gặp khó khăn cho thấy những gì bạn đã thử và sau đó chúng ta có thể thấy nơi chúng tôi có thể giúp đỡ. Dựa trên những gì bạn đã cung cấp cho đến nay nó sẽ là quá rộng cho một câu trả lời * hoàn thành *. Cộng đồng sẽ cố gắng giúp đỡ tốt nhất có thể nhưng không ngờ rằng nó sẽ làm mọi thứ cho bạn. – Nkosi