MOQ C# 查询 It.IsAny 返回一个列表
本文关键字:一个 列表 返回 查询 It IsAny MOQ | 更新日期: 2023-09-27 17:55:14
我在晚上取得了很大的进步。我终于设法设置了我的测试。现在我的代码将执行第一个测试并最终进入控制器的 CREATE 方法。我正在尝试查看是否需要更改我的控制器方法,以便它可以采用完整的对象(也许创建一个新的 IF 语句,检查管理员密钥和管理员名称是否不为空。您对设计模式和实际的单元测试设计有什么建议吗?
测试:
public void Creating_One_Note()
{
var note = new AdminNote()
{
NoteId = 00003,
UserKey = "89df3f2a-0c65-4552-906a-08bceabb1198",
AdminKey = "4b942342-8f73-490c-b9df-f29ac859d7d7",
NoteText = "TEST NOTE FOR THIS TEST YOU KNOW",
CreateDate = DateTime.Now,
ModifiedDate = DateTime.Now,
AdminName = "Marco",
};
var a = _controller.Create(note);
Assert.IsNotNull(a);
}
控制器创建方法:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(AdminNote adminNote)
{
try
{
if (ModelState.IsValid)
{
adminNote.AdminKey = System.Web.HttpContext.Current.User.Identity.GetUserId();
adminNote.AdminName = System.Web.HttpContext.Current.User.Identity.GetUserName();
adminNote.CreateDate = DateTime.Now;
adminNote.ModifiedDate = DateTime.Now;
adminNote.ObjectState = ObjectState.Added;
_adminNoteService.Insert(adminNote);
return RedirectToAction("UserDetails", "Admin", new { UserKey = adminNote.UserKey });
}
}
catch (Exception ex)
{
ControllerConstants.HandleException(ex);
ViewBag.PopupMessage(string.Format("We're sorry but an error occurred. {0}", ex.Message));
}
return View(adminNote);
}
如您所见,我的控制器方法返回一个 VIEW,我知道我将不得不调整我的测试才能理解这一点。但是,控制器方法将跳转到异常,因为它尝试设置管理员密钥和管理员名称(我从前端获得的信息)。对于此测试,我正在对其进行硬编码,我想查看该方法是否将其添加到存储库中。在这种情况下,我该怎么办?
_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>())).Returns<List<AdminNote>>(null);
这是返回null
,因为你告诉它:)。Moq 返回作为参数传递给 Returns
方法的对象。Returns
方法的类型参数(在您的情况下List<AdminNote>
)仅指定返回值的类型,但 Moq 不会自动创建该类型的实例。
如果您希望 Moq 返回非空值,则应传递非空值,例如:
_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>()))
.Returns<List<AdminNote>>(new List<AdminNote>());
此外,在这种情况下,编译器可以隐式确定 Returns
方法的类型参数,因此您可以省略它并简单地编写:
_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>()))
.Returns(new List<AdminNote>());