繁体   English   中英

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

[英]MOQ C# QUERIES It.IsAny returning a List

夜间我取得了很大进步。 我终于设法进行了测试。 现在,我的代码将执行第一个测试,并最终到达控制器的CREATE METHOD。 我试图查看是否需要更改控制器方法,以便可以使用完整的对象(也许创建一个新的IF语句,检查admin KEY和Admin Name是否不为null。关于设计模式,您有任何建议吗?和现实的单元测试设计?

测试:

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(我从前端获得的信息)。 对于此测试,我正在对其进行硬编码,并且我想查看该方法是否将其添加到存储库中。 在这种情况下我该怎么办?

_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>())).Returns<List<AdminNote>>(null);

这返回null因为您告诉它:)。 Moq将您作为参数传递的对象ReturnsReturns方法。 Returns方法的类型参数(在您的情况下为List<AdminNote> )仅指定返回值的类型,但是Moq不会自动创建该类型的实例。

如果您希望Moq返回一个非空值,那么您应该传递一个非空值,例如:

_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>()))
    .Returns<List<AdminNote>>(new List<AdminNote>());

此外,在这种情况下,编译器可以隐式确定Returns方法的type参数,因此您可以忽略它并简单地编写:

_adminNoteRepository.Setup(r => r.Find(It.IsAny<AdminNote>()))
    .Returns(new List<AdminNote>());

c# xUnit Moq It.IsAny<object> 没有像预期的那样嘲笑<div id="text_translate"><p>以下是一段代码(简单的 HTTP post 调用),我试图在 Azure 函数中模拟:</p><pre> await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));</pre><p> 请注意,httpClient.PostAsync() 函数有两个参数:URL 作为字符串,body 作为对象。</p><p> 现在,在我的测试中,我像这样模拟这个 POST 调用:</p><pre> httpClientMock.Setup(s =&gt; s.PostAsync(It.IsAny&lt;string&gt;(), It.IsAny&lt;object&gt;())).ReturnsAsync(mockedHttpResponse);</pre><p> 我期待await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json")不会被调用,因为我将它设置为与任何对象一起工作。但是,我的测试用例失败了例外:</p><blockquote><p> 在 System.IO.Path.Combine(String path1, String path2) 处发现 System.ArgumentNullException 消息“Value cannot be null. (Parameter 'path1')”</p></blockquote><p> 当我通过在测试中设置环境变量来提供正确的路径(即使是虚拟路径也不起作用)时,它就起作用了。 但这似乎不是正确的方法,因为单元测试旨在在各种机器上运行,并且每台机器的基本路径都不同。</p></div></object>

[英]c# xUnit Moq It.IsAny<object> not mocking as expected

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 c# xUnit Moq It.IsAny<object> 没有像预期的那样嘲笑<div id="text_translate"><p>以下是一段代码(简单的 HTTP post 调用),我试图在 Azure 函数中模拟:</p><pre> await httpClient.PostAsync("https://url.com", await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json"));</pre><p> 请注意,httpClient.PostAsync() 函数有两个参数:URL 作为字符串,body 作为对象。</p><p> 现在,在我的测试中,我像这样模拟这个 POST 调用:</p><pre> httpClientMock.Setup(s =&gt; s.PostAsync(It.IsAny&lt;string&gt;(), It.IsAny&lt;object&gt;())).ReturnsAsync(mockedHttpResponse);</pre><p> 我期待await File.ReadAllTextAsync(Path.Combine(Environment.GetEnvironmentVariable("APP_DIRECTORY"), "file.json")不会被调用,因为我将它设置为与任何对象一起工作。但是,我的测试用例失败了例外:</p><blockquote><p> 在 System.IO.Path.Combine(String path1, String path2) 处发现 System.ArgumentNullException 消息“Value cannot be null. (Parameter 'path1')”</p></blockquote><p> 当我通过在测试中设置环境变量来提供正确的路径(即使是虚拟路径也不起作用)时,它就起作用了。 但这似乎不是正确的方法,因为单元测试旨在在各种机器上运行,并且每台机器的基本路径都不同。</p></div></object> Moq转换It.IsAny <Exception> 去吧 <string> 在期待中 使用It.IsAny进行Moq单元测试 <DateTime> ()失败 Moq&gt; = 4.5.7暴露It.IsAny上的异常 <decimal> () Moq 在使用 It.Is 但不是 It.IsAny 验证时抛出 NullReferenceException Moq的It.IsAny怎么样? <T> ()实施 设置最小起订量以使用It.IsAny模拟复杂类型 如何将表达式签名转换为适用于Moq的It.IsAny的表达式 使用Moq It.IsAny使用通用Lambda设置Mock用于泛型函数 Moq 使用 ReturnsAsync 并修改 It.IsAny 输入参数
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM