[英]Unit Testing Controller that uses GetUserASync (User)
我正在嘗試對控制器操作返回正確的視圖進行單元測試。 我正在使用 .NET Core、Moq 和 NUnit。
我想測試默認的ManageController
,
構造函數在下面,
public ManageController(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
IEmailSender emailSender,
ILogger<ManageController> logger,
UrlEncoder urlEncoder)
{
_userManager = userManager;
_signInManager = signInManager;
_emailSender = emailSender;
_logger = logger;
_urlEncoder = urlEncoder;
}
並且我正在嘗試對以下Index
操作進行單元測試,並在成功時斷言它返回正確的 ViewModel。 (並且將來會添加其他返回不同 ViewModel 的路徑)
[HttpGet]
public async Task<IActionResult> Index()
{
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
var model = new IndexViewModel
{
Username = user.UserName,
Email = user.Email,
PhoneNumber = user.PhoneNumber,
IsEmailConfirmed = user.EmailConfirmed,
StatusMessage = StatusMessage
};
return View(model);
}
經過多次嘗試,我最接近的解決方案如下,
我已經ClaimsPrincipal
了UserManager
,並使用 ID 為“1”的ClaimsPrincipal
設置了GetUserASync
方法。 我還將HttpContext
設置為使用相同的ClaimsPrincipal
並將其傳遞給控制器。
由於 Action 是異步的,我被迫將測試方法設為異步。 目前,由於返回的異步Task
為空,測試失敗。 我無法查看其余測試是否通過,因為我無法克服此錯誤。
[Test]
public async Task Index_UserExists_ReturnsViewAsync()
{
var mockUserStore = new Mock<IUserStore<ApplicationUser>>();
var mockUserManager = new Mock<UserManager<ApplicationUser>>(mockUserStore.Object, null, null, null, null, null, null, null, null);
var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.NameIdentifier, "1"),
}));
mockUserManager.Setup(x => x.GetUserAsync(user));
var controller = new ManageController(mockUserManager.Object, null, null, null, null)
{
ControllerContext = new ControllerContext()
{
HttpContext = new DefaultHttpContext() { User = user }
}
};
//Act
var result = await controller.Index();
//Assert
Assert.IsInstanceOf<ViewResult>(result);
}
設置模擬以返回任務,以便可以等待並允許代碼按預期流動
//...
var appUser = new ApplicationUser {
//...populate as needed
}
mockUserManager
.Setup(_ => _.GetUserAsync(user))
.ReturnsAsync(appUser); // Allows mocked member to be awaited and return desired type
//...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.