c# - 试图在 ASP Identity(非核心)中模拟某些函数并且不会编译
问题描述
我在模拟 ASP.NET 5 中的默认项目中散布在 AccountsController 周围的一些对象时遇到了麻烦,它使我无法对控制器进行单元测试。例如,我正在尝试模拟注册操作的代码。
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser
{
FirstName = model.FirstName, LastName = model.LastName, UserName = model.Email, Email = model.Email,
IsActive = false, NewRequest = true
};
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var email = _settings.GetEmailLogic();// EmailLogic(_settings);
var emailuser = new VGSEmail(_settings)
{
Id = user.Id,
FirstName = model.FirstName,
LastName = model.LastName,
ToEmail = new List<string> {model.Email},
FromEmail = _settings.GetFromEmail(),
Subject = EmailMessages.RegisterSubject(),
Body = EmailMessages.RegisterMessage(model.FirstName)
};
var message = email.CreateMailMessage(emailuser);
email.Send(message);
await SignInManager.SignInAsync(user, false, false);
// For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
// Send an email with this link
// string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
// var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
// await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
return RedirectToAction("SelectOrganization");
}
AddErrors(result);
}
我到达 UserManager.CreateAsync 并且它死于 null。所以我尝试以下方法:
var userManager = new Mock<ApplicationUserManager>();
var identityresult = new Mock<IdentityResult>();
identityresult.Setup(s => s.Succeeded).Returns(true);
userManager.Setup(s => s.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
.ReturnsAsync(Task.FromResult(identityresult);
但是第二行将无法编译并不断抱怨:
“ISetup>”不包含“ReturnsAsync”的定义,并且最佳扩展方法重载“SequenceExtensions.ReturnsAsync>>(ISetupSequentialResult>>>, Task>)”需要“ISetupSequentialResult>>>”类型的接收器 OnlineRepoWebSite.Tests
我知道它包含 ReturnsAsync 的定义,因为我一直在使用它。
例如,以下工作正常:
userManager.Setup(s => s.FindById(It.IsAny<string>())).Returns(new ApplicationUser());
userManager.Setup(s => s.FindByIdAsync(It.IsAny<string>())).Returns(Task.FromResult(new ApplicationUser()));
但我在使用 SignInManage 时也遇到了类似的问题。例如,第二行也不会编译。
var signInManager = new Mock<ApplicationSignInManager>(userManager, authenticationManager.Object);
signInManager.Setup(s => s.PasswordSignInAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(),It.IsAny<bool>()))
.ReturnsAsync(Task.FromResult(SignInStatus.Success));
谁能指出我做错了什么?如果有人对 MVC 中的默认 AccountController 进行了完整的单元测试,那就更好了,如果我以后遇到更多问题,我会非常感激你。
解决方案
调用时ReturnsAsync
返回实际的返回对象而不是Task
. IE:
userManager
.Setup(_ => _.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
.ReturnsAsync(identityresult); //<-- This here
也为另一个
signInManager
.Setup(_ => _.PasswordSignInAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>(),It.IsAny<bool>()))
.ReturnsAsync(SignInStatus.Success);
.ReturnsAsync(TValue)
基本上是一个包装器.Returns(Task.FromResult(TValue))
至于使控制器更具可测试性,这是一个广泛的话题。
也许我在这里给出的答案
将 ApplicationUser 和其他模型移出 MVC 项目
可能会有所帮助,但它确实需要大量重构才能使代码更加可靠。
推荐阅读
- android - 从 Google Maps API 获取街道信息
- python - ValueError:无法将字符串转换为浮点数:'2,3972E-7'---loadtxt(numpy)
- python - 在python中将具有相同列名的几列以另一列结尾
- ruby-on-rails - 在 Windows 10 上显示图像错误轨道 6 的操作文本
- bash - Bash 使用“?” 作为调用帮助函数的参数
- azure-function-app - Azure Function Apps 混合连接连接到 Azure 负载均衡器
- libreoffice - LibreOffice 链接到参考书目
- javascript - JavaScript:JSON Stringify 和 String() 之间的短路选择取决于输出
- azure - 无法连接Azure自动化和在线交换
- apache-flink - pyflink Table api中的Py4JJavaError