Moq 来自派生类的基类函数

2023-11-26

我是 Moq 的新手,刚刚观看了 Moqing 上的pluralsight 视频,所以我觉得自己有能力去编写一些测试。我有一个基类,比如说 Sheet,它实现了 ISheet 接口。 Sheet 是页面的基类:

abstract class Sheet: ISheet
{
    public virtual void CreateSheet()  // Defined in ISheet
    {
    }
    public virtual void BuildSheet() // Defined in ISheet
    {
    }
    //and some abstract methods, etc.
}

public class Page : Sheet
{
    public override void CreateSheet()
    {
        BuildSheet(); // Base class implementation
    }
}

我重写了基类中的方法之一CreateSheet(),但我想测试一下BuildSheet()从我的派生类调用基类中的方法:

所以在我的测试类中,我 Moq SUT 而不是接口

var MockSheet = new Moq<Page>();

调用方法:

var actual = MockSheet.Object.CreateSheet(); 

然后验证

MockSheet.Verify(x => x.BuildSheet(), Times.AtLeastOnce);

相反,我得到 MockException“模拟上的预期调用至少一次但从未执行。 CreateSheet 方法永远不会被调用。如果我将 CreateSheet 方法更改为:

public void CreateDocSheet() // removed override
{
    BuildSheet() // base classses implementation
}

在测试调用中:

var actual = MockSheet.Object.CreateDocSheet();  

有用。我不明白为什么。我相信从功能上讲,这是一种有效的编码方式,我有工作表,有 2 页,我有一个接口,定义了应实现的所有函数和属性,我在基类中实现了这些函数,但不是全部方法需要在派生类中实现,因此,一些方法被重写,一些方法使用基类实现。请解释为什么使用该函数的重写版本会出现问题?


如果你改变

var MockSheet = new Moq<Page>();

into

var MockSheet = new Moq<Page> { CallBase = true, };

你的模拟(你可以将其视为派生类Page)将从中调用实现Page在模拟自己的覆盖中CreateSheet.

默认行为(如果您不更改CallBase) 是让 Moq 覆盖它可以覆盖的每个方法和属性,并使用empty执行。环境CallBase to true让 Moq 调用Page相反,就像我说的那样。

(当然,使用MockSheet.Setup(x => x.CreateDocSheet()).Callback(() => { /* something */ })如果你想CreateDocSheet做一些不平凡的事情。)

如果您删除了virtual修饰符来自CreateSheet,起订量不能再覆盖或mock这位会员。想一想:Moq 如何“模拟”非虚拟方法?因此,该调用完全绕过了 Moq 的类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Moq 来自派生类的基类函数 的相关文章

  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 如何配置Powershell控制台的编码?

    我在 Powershell 控制台中显示中文字符时遇到一些问题 所有中文都显示为矩形 我相信这是一个编码问题 有谁知道如何配置Powershell控制台使用UTF8编码 看一下这个帖子 当前编码 Console Out 设置编码 UTF8
  • 即使块本身没有执行,在捕获列表中使用无主也会导致崩溃

    在这里 我正在尝试泄漏 所以我故意做了一个强大的参考循环 看看仪器是否会检测到某些东西 我得到了意想不到的结果 仪器中显示的泄漏当然是有道理的 但是随机崩溃有点神秘 由于我稍后会提到的两个事实 我这里有一个名为SomeClass class
  • 如何手动清除特定的视图模型?

    据我了解 当我们在片段中调用此代码时 我们将从 Activity ViewModelStore 获得一个视图模型实例 viewModel ViewModelProviders of activity get SharedViewModel
  • 在哪里可以找到好的 ASP.NET MVC 示例? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 过去两年我一直在使用 Castle MonoRail 但在新工作中我将引入 ASP NET MVC 我了解观点 行动等的基础知识 我只需要为具有 M
  • 通过 GLFW 进行鼠标输入的简单 OpenGL 程序中出现明显的延迟

    这是一个简单的程序 它沿着鼠标光标的位置绘制一个三角形 我 希望你 能注意到的是 三角形落后于光标 它不像拖动整个窗口时那么紧 所以我的问题是 我做错了什么 是什么导致了这种滞后 我意识到的一件事是 移动三角形的实际像素值就足够了 而不必一
  • 防止 Jersey 客户端在发布大文件时导致内存不足错误

    使用以下方法将大文件作为 InputStream 放置时Jersey在客户端 看起来文件的全部内容在发送到服务器之前都被缓冲到内存中 当 JVM 耗尽堆空间时 这会导致大文件出现问题 如何防止 Jersey 客户端出现这种行为 服务器端的J
  • 无法从 jquery 对象调用 Javascript 方法?

    我正在阅读 Learning jQuery 1 3 Jonathan Chaffer 和 Karl Swedberg 在对表进行排序时 他们使用了 get 打电话之前 sort 并且说 我们需要将 jQuery 对象转换为 DOM 节点数组
  • Numpy“逻辑或”用于两个以上的参数

    Numpy s logical or函数需要不超过两个数组进行比较 如何找到两个以上数组的并集 对于 Numpy 也可以提出同样的问题logical and并获得两个以上数组的交集 如果你问的是numpy logical or 那么不 正如
  • C++ 类模板未定义对函数的引用[重复]

    这个问题在这里已经有答案了 当我在主函数中调用模板类 add 和 greater 中的两个函数时 我不断收到未定义的引用 所以我有 编号 h ifndef NUMBER H define NUMBER H template
  • HTML 5 添加 XML 命名空间

    谁能告诉我如何向 HTML 5 文档添加额外的 XML 命名空间 我正在尝试创建以下内容的 HTML 5 版本 这只是删除 xhtml 命名空间的情况吗 Thanks 根据 WHATWG 在 html 5 中 只要命名空间是 就可以在每个
  • 如何在 Mac OS X 上安装适用于 Python 2.7 的 Bloomberg API 库

    我正在尝试设置我的 Mac OS X 系统以使用pdblpPython 库需要我先安装适用于 Python 的 Bloomberg 开放 API 库 克隆 git repo 并运行后python setup py install I get
  • PythonNet FileNotFoundException:无法找到程序集

    我正在尝试执行一个使用 Python For Net 的 Python 脚本 https github com pythonnet pythonnet 加载名为 Kratos 3 dll 的 C 库 该库与脚本位于同一文件夹中 但找不到该文
  • 在 C# 中操作 RichText 的更好方法?

    我需要创建一些具有标准 格式 如粗体 斜体 缩进等 的 RichText 并将其复制到剪贴板 我现在这样做的方式似乎有点不优雅 我正在创建一个 RichTextBox 项目并通过它应用我的格式 如下所示 RichTextBox rtb ne
  • 如何异步调用我的 WCF 服务?

    我有一个从 Windows 服务调用的 WCF 服务 WCF 服务运行一个 SSIS 包 该包可能需要一段时间才能完成 我不希望我的 Windows 服务必须等待它完成 如何使 WCF 服务调用异步 或者默认情况下是异步的 MSDN 的以下
  • 如何使用 pip 从 Conda 安装 rdkit 包?

    我正在尝试使用 pip3 安装 rdkit 但这不起作用 sudo pip3 install rdkit Error Could not find a version that satisfies the requirement rdkit
  • node.js - 按时附加事件处理程序

    我正在学习 Node js 并在 Node js 手册中发现了这个示例 var req http request options req end req on upgrade function res socket upgradeHead
  • 如何捕获JFrame的关闭按钮单击事件?

    我想调用一个方法confirmExit 当单击 JFrame 标题栏的红色关闭按钮时 我怎样才能捕获该事件 如果用户选择不继续 我还想阻止窗口关闭 import javax swing JOptionPane import javax sw
  • 使用 $.ajax 调用 Web 方法时出现身份验证失败错误

    当我进行 JQuery 调用时 我收到身份验证失败响应 Message Authentication failed StackTrace null ExceptionType System InvalidOperationException
  • rhandsontable 更改特定行的背景

    我在 R闪亮中使用rhandsontable 我想更改第一列中带有 Sum 的行的颜色 由于行数不固定 因此根据行号选择 Sum 行不起作用 我已经尝试了附加的代码 不幸的是它不起作用 非常感谢您的帮助 library shiny libr
  • Moq 来自派生类的基类函数

    我是 Moq 的新手 刚刚观看了 Moqing 上的pluralsight 视频 所以我觉得自己有能力去编写一些测试 我有一个基类 比如说 Sheet 它实现了 ISheet 接口 Sheet 是页面的基类 abstract class S