C# 使用GetUserASync(用户)的单元测试控制器
我正在尝试单元测试控制器操作是否返回正确的视图。我正在使用.NETCore、Moq和NUnit 我想测试默认的C# 使用GetUserASync(用户)的单元测试控制器,c#,unit-testing,asp.net-core,nunit,moq,C#,Unit Testing,Asp.net Core,Nunit,Moq,我正在尝试单元测试控制器操作是否返回正确的视图。我正在使用.NETCore、Moq和NUnit 我想测试默认的ManageController 建造师在下面 public ManageController( UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, IEmailSender emailSender, ILogger<M
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;
}
经过多次尝试,我最接近的解决方案如下:
我模拟了,UserManager
,并使用Id为“1”的ClaimsPrincipal
设置了GetUserASync
方法。我还将HttpContext
设置为使用相同的ClaimsPrincipal
,并将其传递给控制器
由于操作是异步的,我被迫使测试方法异步。当前,由于返回的异步任务
为空,测试失败。我看不出其余的测试是否通过,因为我无法通过这个错误
[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);
}
[测试]
公共异步任务索引\u UserExists\u ReturnsViewAsync()
{
var mockUserStore=new Mock();
var mockUserManager=new Mock(mockUserStore.Object,null,null,null,null,null,null);
var user=新索赔人(新索赔人)(新索赔[]
{
新索赔(ClaimTypes.NameIdentifier,“1”),
}));
mockUserManager.Setup(x=>x.GetUserAsync(user));
var controller=new ManageController(mockUserManager.Object,null,null,null,null)
{
ControllerContext=新的ControllerContext()
{
HttpContext=new DefaultHttpContext(){User=User}
}
};
//表演
var result=await controller.Index();
//断言
Assert.IsInstanceOf(结果);
}
设置模拟以返回任务,以便等待它并允许代码按预期流动
//...
var appUser = new ApplicationUser {
//...populate as needed
}
mockUserManager
.Setup(_ => _.GetUserAsync(user))
.ReturnsAsync(appUser); // Allows mocked member to be awaited and return desired type
//...
太好了,谢谢。我尝试过mockUserManager.Setup(=>880;.GetUserAsync(user)).Returns(appUser);但是,如果异步重新执行任务而不是用户,则会出现一个明显的错误。我没想过要让它成为RetrunAsync()
//...
var appUser = new ApplicationUser {
//...populate as needed
}
mockUserManager
.Setup(_ => _.GetUserAsync(user))
.ReturnsAsync(appUser); // Allows mocked member to be awaited and return desired type
//...