我在夜间取得了很大的进步。我终于设法完成了我的测试。现在我的代码将执行第一个测试并最终进入控制器的CREATE METHOD。我想看看我是否需要更改我的控制器方法,以便它可以采用一个完整的对象(可能创建一个新的IF语句,检查管理员KEY和管理员名称是否为空。你对设计模式有任何建议吗?现实的单元测试设计?
测试:
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我知道我将不得不调整我的测试以便能够理解这一点。但是,控制器方法将跳转到异常,因为它试图设置AdminKey和AdminName(我从前端获得的信息)。对于这个测试我正在硬编码,我想看看该方法是否将它添加到存储库。在这种情况下我该怎么办?
答案 0 :(得分:2)
_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>());