MOQ C#QUERIES It.IsAny返回一个List

时间:2015-06-10 20:57:08

标签: c# .net moq

我在夜间取得了很大的进步。我终于设法完成了我的测试。现在我的代码将执行第一个测试并最终进入控制器的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(我从前端获得的信息)。对于这个测试我正在硬编码,我想看看该方法是否将它添加到存储库。在这种情况下我该怎么办?

1 个答案:

答案 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>());