使用 Moq 可以验证匿名类型的方法调用吗?

2024-02-11

我正在尝试使用 Moq 验证方法调用,但我无法完全正确地理解语法。目前,我已将此作为我的验证:

repository.Verify(x => x.ExecuteNonQuery("fav_AddFavorites", new
{
    fid = 123,
    inputStr = "000456"
}), Times.Once());

代码可以编译,但测试失败并出现错误:

Expected invocation on the mock once, but was 0 times: 
x => x.ExecuteNonQuery("fav_AddFavorites", new <>f__AnonymousType0<Int32, String>(123, "000456"))
No setups configured.

Performed invocations:
IRepository.ExecuteNonQuery("fav_AddFavorites", { fid = 123, inputStr = 000456 })

如何验证方法调用并匹配匿名类型的方法参数?

UPDATE

回答问题:

我试图验证该方法是否被调用以及参数是否正确。

我试图验证的方法的签名是:

int ExecuteNonQuery(string query, object param = null);

设置代码很简单:

repository = new Mock<IRepository>();

UPDATE 2

看起来这是 Moq 以及它如何处理 .Net 中的匿名类型的问题。 Paul Matovich 发布的代码运行良好,但是,一旦代码和测试位于不同的程序集中,测试就会失败。


这过去了

        public class Class1
    {
        private Class2 _Class2;
        public Class1(Class2 class2)
        {
            _Class2 = class2;
        }

        public void DoSomething(string s)
        {
            _Class2.ExecuteNonQuery(s, new { fid = 123,  inputStr = "000456" });
        }
    }

    public class Class2
    {
        public virtual void ExecuteNonQuery(string s, object o)
        {
        }
    }

    /// <summary>
    ///A test for ExecuteNonQuery
    ///</summary>
    [TestMethod()]
    public void ExecuteNonQueryTest()
    {
        string testString = "Hello";
        var Class2Stub = new Mock<Class2>();
        Class1 target = new Class1(Class2Stub.Object);
        target.DoSomething(testString);
        Class2Stub.Verify(x => x.ExecuteNonQuery(testString, It.Is<object>(o => o.Equals(new { fid = 123, inputStr = "000456" }))), Times.Once());
    }

##更新##

这很奇怪,它在不同的程序集中不起作用。有人可以给我们详细的定义,说明为什么来自不同程序集的 object.equals 的行为不同,但对于不同的程序集,这将起作用,对象值中的任何差异都将返回不同的哈希码。

        Class2Stub.Verify(x => x.ExecuteNonQuery(testString, It.Is<object>(o => o.GetHashCode() == (new { fid = 123, inputStr = "000456" }).GetHashCode())), Times.Once());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Moq 可以验证匿名类型的方法调用吗? 的相关文章

随机推荐

  • 使用 R 模拟有偏差的 6 面骰子

    在 R 中 我想计算出模拟 6 面骰子被抛出 44 次的代码 骰子有偏差 因为掷出数字 6 的可能性是其两倍 与任何其他个人号码一样 我可以为一个无偏见的骰子做到这一点 但不知道该怎么做这个 Thanks 你需要两个replace TRUE
  • xlsxwriter 中的粗边框

    是否有任何选项可以使用 xlsxwriter 在 Excel 中添加粗边框 我正在使用条件格式在范围之间编写边界 Add table won t work in my case 是否有任何选项可以使用 xlsxwriter 在 Excel
  • 如何在 python 中对关键字参数使用 executor.map 函数

    我遇到了一个场景 我需要为 python 中的值列表并行运行函数 我从中学到了 executor mapconcurrent futures会做这项工作 我能够使用以下语法并行化该函数executor map func values 但现在
  • “已弃用”是什么意思? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我是and
  • Xamarin Forms MVVM (Prism) with Media.Plugin - 如何从设备存储中获取拍摄的照片

    我正在使用 Xamarin Forms PCL MVVM Prism 和 MediaPlugin https github com jamesmontemagno MediaPlugin https github com jamesmont
  • MethodInfo.Invoke参数顺序

    我正在尝试使用反射调用方法 像这样的事情 method Invoke instance propValues ToArray 问题是没有办法确保参数数组的顺序正确 有没有办法通过名称来指定哪些值适用于哪个参数 或者我真的必须制作一个定制活页
  • 允许调试器;某些文件中的语句,使用 ESLint

    假设我想使用这个规则 https eslint org docs rules no debugger https eslint org docs rules no debugger 但是 我想在其中保留大约 15 个文件 声明 我可以在 t
  • 将额外的系统属性添加到 Eclipse 编程重启

    我有一个插件 可以使用以下命令强制重新启动 Eclipse Workbench getInstance restart 但是 我需要重新启动以包含新的环境变量 eclipse refreshBundles true 有什么方法可以仅为下次重
  • 无法在 Python 3.6.6 上的 Open CV 3.4.1 上运行跟踪

    我尝试在 python 3 6 6 上使用 open CV 运行跟踪 但它显示 AttributeError 模块 cv2 没有属性 TrackerKCF create 我也尝试了 python 2 7 API 但结果相同 Attribut
  • 使用 mongodb 聚合框架计算频率

    我正在尝试根据 10 秒的间隔计算数据库中文档的频率 这就是我的数据库对象的样子 created at 2014 03 31T22 30 48 000Z id 450762158586880000 id 5339ec9808eb125965
  • 带区域的 Orchard/MVC WCF 服务 URL

    Bertrand 创建了一个博客post http weblogs asp net bleroy archive 2011 04 20 orchard 1 1 what s in it for developers aspx指定如何在 Or
  • 如何在 gcc 中强制执行 C89 风格的变量声明?

    我工作的代码库主要是 C 和一点点 C 并且主要是用 gcc 构建的 但有时需要用 MSVC 构建 微软的 C 编译器仍然是 C89 带有一些小的扩展 并且它仍然不支持混合代码和变量定义 laC C99 因此 我需要找到一种方法来防止开发人
  • Android 键盘显示后 jQuery 移动页脚或视口大小错误

    我的 jquery 移动网络应用程序遇到以下问题 我的 jquery 应用程序有一个固定的页脚 但是当 android 键盘打开时 即单击浏览器栏并手动重新加载页面时 视口似乎仅从顶部 浏览器栏下方 向下到上部键盘边缘 然后页面重新加载 视
  • 对于特殊字符,URL 编码失败。 #安卓

    我正在研究需要的解决方案encode串入utf 8格式 这个字符串只是我正在读取的设备名称BluetoothAdapter getDefaultAdapter name 对于其中一个示例 我得到了一个像这样的字符串ABC and encod
  • Angular 指令 ng-if 不评估条件语句

    我是 Web 开发和 AngularJS 的新手 我尝试使用指令 ng if 仅在从数据库返回的列表大于 1 时显示 div 块 但它不起作用 我是否滥用了该指令 我环顾四周 没有找到任何有效的解决方案 目前 两个 div 都会显示 并且
  • 通过 Karma 运行时如何调试 PhantomJS

    我通过 Jasmine Karma 和各种浏览器进行测试 我目前正在调试一个仅在 PhantomJS 中失败的测试 我想调试这个调用 所以我在 karma 中设置了一个自定义 PhantomJS 启动器 它在调试端口打开的情况下运行它 我可
  • 检测圆形(非精确圆形)路径算法?

    我收到一个路径 来自触摸事件的 x y 坐标列表 如何检测该路径形成圆形路径 不是完整或精确的圆 有什么算法或方法可以检测到这一点吗 这是一篇论文 总结了将圆拟合到数据的各种方法 http www cs bsu edu homepages
  • ios metal:着色器中使用的变量数量限制

    在向着色器添加一些复杂性后 我今天开始收到以下错误 Execution of the command buffer was aborted due to an error during execution Discarded victim
  • 多个视图控制器上的相同 UIProgressView

    PREAMBLE 我有一个 iOS 应用程序 有两个页面的注册过程 我在每个页面上安装了一个 UIProgressView 来测量用户在所述注册过程中的累积进度 目前 注册过程由六个字段组成 当文本字段完成编辑时 现有的 UIProgres
  • 使用 Moq 可以验证匿名类型的方法调用吗?

    我正在尝试使用 Moq 验证方法调用 但我无法完全正确地理解语法 目前 我已将此作为我的验证 repository Verify x gt x ExecuteNonQuery fav AddFavorites new fid 123 inp