对同一对象调用两次 MustHaveHappened 失败

2023-12-05

给定以下被测类(以及关联的 DTO 类和接口):

public class Foo
{
    private readonly IBar _bar;

    public Foo(IBar bar) { _bar = bar; }

    public void DoStuff()
    {
        var dto = new DTO();

        dto.Num = 1;
        _bar.Test(dto);

        dto.Num = 2;
        _bar.Test(dto);
    }
}

public class DTO { public int Num { get; set; } }

public interface IBar { void Test(DTO dto); }

这个测试方法(尝试验证 IBar.Test() 是否被调用两次:一次 Num = 1,一次 Num = 2):

public void TestMethod1()
{
    var bar = A.Fake<IBar>();
    var foo = new Foo(bar);
    foo.DoStuff();

    A.CallTo(() => bar.Test(A<DTO>.That.Matches(x => x.Num == 1))).MustHaveHappened();
    A.CallTo(() => bar.Test(A<DTO>.That.Matches(x => x.Num == 2))).MustHaveHappened();
}

第一个“MustHaveHappened”调用失败。我发现这是因为对 IBar.Test() 的两次调用使用的 DTO 是同一个实例。如果我更改代码以使用两个不同的 DTO 调用 IBar.Test(),它将按预期工作。

我的问题是:这是 FakeItEasy 中的错误还是我做错了什么?


这是正确的行为,而不是错误。 FakeItEasy 记录带参数的调用,但它不存储调用期间参数的内部状态 - 它仅存储参数本身的引用/值。最后,在验证阶段,DTO对象的当前状态是Num等于 2,这就是 FakeItEasy 将验证的内容。

我不确定是否有对这种情况的开箱即用支持,但您可以轻松地实现解决方法(无需创建第二个DTO目的):

var bar = A.Fake<IBar>();
var foo = new Foo(bar);
var expectedNumValues = new [] { 1, 2 };
var actualNumValues = new List<int>();
// Whenever a call to IBar.Test is made, store DTO.Num in list
A.CallTo(() => bar.Test(A<DTO>.Ignored)).Invokes(
    fakeCall =>
    {
        var dto = (DTO) fakeCall.Arguments[0];
        actualNumValues.Add(dto.Num);
    }
);

foo.DoStuff();

// this verifies that both collections contain same elements at same positions
CollectionAssert.AreEqual(expectedNumValues, actualNumValues);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对同一对象调用两次 MustHaveHappened 失败 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Python for 循环跳过所有其他值

    我在 django 应用程序中遇到了一个奇怪的问题 其中 for 循环跳过了所有其他项目 我已经获取了返回的查询集并且list ed 进行迭代 这样做的目的是删除另一个列表中的项目 该列表通过 POST 变量传递到视图 该视图是一个ajax
  • 如何在 Windows Phone 中使用 Bing 搜索 API?

    我正在尝试使用 Bing 搜索 API 查找图像作为应用程序内图块的背景 我已将 BingSearchContainer cs 包含在我的项目中 但无法使其与此处提供的示例代码一起使用 有关如何在我的 Windows Phone 8 应用程
  • 有时读取 ImportXML 单元格时,.getValue() 返回 #N/A

    我编写了一个脚本 将 ImportXML 公式写入单元格 然后几秒钟后尝试读取单元格并将其替换为它的返回值 问题是当我用获取的值替换单元格时 我经常 但并非总是 得到 N A 问题是 我能够在短时间内看到正确的值 因此 ImportXML
  • Docker 中 Bcrypt 安装失败

    我使用 MongoDB 创建了一个在 Docker 中运行的节点应用程序 它工作得很好 直到我包括在内节点 bcrypt js 这使得 Node 崩溃node gyp and bcrypt 该应用程序在本地和 Heroku 上运行良好 我尝
  • CardLayout,通过ButtonClick在JPanel之间切换

    我想通过单击 JPanel 上的按钮在 JPanel 之间切换 例如 我有一个带有 JButton simknop 的 JPanel sim 和一个带有 JButton helpknop 的 JPanel 帮助 我想通过单击按钮在这 2 个
  • PaintEvent 中警告 QPainter [重复]

    这个问题在这里已经有答案了 我尝试在 QChartView 中绘制更多信息 因此我重新实现了paintEvent virtual void paintEvent QPaintEvent event QChartView paintEvent
  • 当 Coq 中使用自己的可判定性时,评估计算不完整

    The Eval compute命令并不总是计算为简单表达式 考虑代码 Require Import Coq Lists List Require Import Coq Arith Peano dec Import ListNotation
  • 为什么用逗号进行双重初始化是非法的?

    我有三个代码片段 这个 1 7 yes that s all the code 编译没问题 这个 double d 1 7 也编译没问题 然而这个 double d 1 7 编译失败 gcc 4 3 4 说 错误 在数字常量之前预期有不合格
  • 调用 webapi 抛出 No Access-Control-Allow-Origin 标头出现在请求的资源上

    我正在尝试按照 Azure 示例通过此处提供的 WSFederation 将 Azure AD 集成到我的 MVC 4 6 Web 应用程序中https github com Azure Samples active directory d
  • Python 按值搜索

    我需要一个合适的解决方案来搜索 Python 嵌套数据结构中的键 假设我有一个带有值 check 的变量和这样的字典 SERVICES domain check whois register user create show delete
  • NoClassDefFoundError:com.opencsv.CSVWriter

    我尝试使用 opencsv libray 来获取加密格式数据 但在 CSV writer 上写入时 我收到 NoClassDefFoundError 我看过很多与相同错误相关的帖子 并尝试了几乎所有方法 但仍然无法纠正问题 下面的链接有同样
  • 现在如何使用 Blaze 在 Meteor 模板中的动态字段上使用 X-editable?

    I had x 可编辑在 Meteor 0 7 2 中工作 但自从升级到 0 8 0 后 它不再正确渲染 我往往会得到一堆空标签 这很令人沮丧 因为数据就在那里 只是在渲染函数被触发时还没有
  • 使服务层可以访问对象,而无需在 MVC4 应用程序中作为参数传递

    我正在构建一个多租户 MVC 应用程序 其中有一个应用程序池和一个数据库 我有一个租户表 并且我的每个模型都有一个标识的 TenantId 每个租户都有一个字符串 Url 用于标识用于访问该租户数据的完整 URL 我可以通过以下方式从 Ba
  • 如何对列表重新排序? [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 给定一个任意大小的数组n 我想根据数组的离散索引重新组织数组的元素 Python 示例 Unique array of size n a b c d e
  • 对 Tkinter bind_class 感到困惑

    我定义了 GCanvas Canvas 的扩展 我的目的是在类级别绑定到 GCanvas 它不起作用 我还尝试绑定到 tk Canvas 但它也不起作用 绑定到root或 GCanvas 实例工作正常 这两种选择对我来说都没有用 但我只是尝
  • PowerShell:将 HTML 表提取为 CSV

    我正在尝试将 HTML 表提取到 CSV 文件 我对 PowerShell 了解不多 但在网上我找到了一些示例 但我总是收到相同的错误消息 您不能对空值表达式调用方法 行数 8 字符 1 table oHTML ParsedHtml bod
  • 使用重写规则从 url 中删除 .php

    我想重写 nginx 中的 url 以便 php扩展名可以省略 这就是我所拥有的 但这对我不起作用 有人知道如何做到这一点吗 Thanks server listen 80 server name example com return 30
  • 根据 3 个变量的颜色 - 麦克斯韦三角形

    我有一个由三个变量 u v w 组成的模型 它们随时间和空间而变化 我对这三个变量的比率特别感兴趣 但我宁愿只使用一张图 而不是显示三张图 每张图对应一个变量 我的想法是使用麦克斯韦三角形 颜色三角形 参见http homepages ab
  • ASP.NET Intranet 站点要求提供凭据 - Windows 身份验证

    我在 ASP Net 中创建了我的第一个网站 并且正在尝试在我们工作的 Intranet 上启动并运行它 我现在几乎已经完成了所有事情 但我遇到了障碍 我需要使用 Windows 身份验证 我的团队的要求 因此我完成了设置网站的过程 我已配
  • 对同一对象调用两次 MustHaveHappened 失败

    给定以下被测类 以及关联的 DTO 类和接口 public class Foo private readonly IBar bar public Foo IBar bar bar bar public void DoStuff var dt