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,我知道我将不得不调整我的测试才能理解这一点。但是,控制器方法将跳转到异常,因为它尝试设置管理员密钥和管理员名称(我从前端获得的信息)。对于此测试,我正在对其进行硬编码,我想查看该方法是否将其添加到存储库中。在这种情况下,我该怎么办?

MOQ C# 查询 It.IsAny 返回一个列表

_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>());