簡體   English   中英

使用 GetUserASync (User) 的單元測試控制器

[英]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);
}

經過多次嘗試,我最接近的解決方案如下,

我已經ClaimsPrincipalUserManager ,並使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM