如何使用MOQ框架为抽象基类创建Mock?

2023-11-23

我想为 MyClass 编写单元测试,但它的基类是一个抽象类。

public class MyClass : AbstractBaseClass
{
}

我想模拟抽象基类,以便在创建要测试的 MyClass 实例时可以跳过其构造函数中的一些逻辑。无论如何我可以做到这一点吗?

//Unit Test
var test = new Mock<IInterface>();
var derivedclass = new DerivedClass(test.Object);

test.Setup(d=>d.MyMethod(It.IsAny<string>()).returns(2);
derivedclass.MyMethod("hello");


// Derived Class
class DerivedClass : AbstractClass{

     //constuctor
    public DerivedClass(IInterface interface){
        _interface = interface;
    }
    public MyMethod(string str){
        return 2;
    }
}

//Abstract Class
public abstract class AbstractClass
{

 // This method gets called when i create the  instance of the derived class in my unit   
  test..

   protected AbstractedClass() : this(new SomeOtherClass()){
       DoSomethingElse();    /// I want to skip this method or mock it.
   }
 }

通过从基类继承,您可以扩展它。它更多的是让您的代码进入可测试状态,而不是让 Moq 为您工作。

  1. 您可以使用组合而不是基类,然后使用可以模拟的依赖项注入(通过接口)。
  2. 或者,如果您必须继承,则提取您不想运行的逻辑到您通过依赖注入再次注入的另一个类中。
  3. 或者将您不想运行的逻辑作为您可以模拟的虚拟方法的一部分。 (就像@Ohad Horesh 的回答:)

    public virtual void DoSomethingElse();
    
    mock.Setup(abs => abs.Foo());  //here the mocked method will be called  
                                   // rather than the real one
    

如果这些选项不可行,那么您要么必须通过派生类测试该功能,要么使用其他模拟框架,例如 TypeMock Isolator、Moles 或 JustMock。

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

如何使用MOQ框架为抽象基类创建Mock? 的相关文章

  • Java中独立于文件系统的文件和路径?

    我正在使用 Java 8 编写一个与文件系统交互的应用程序 为了使测试更容易 我注入了FileSystem到我的方法中 可以将其换出进行测试 我目前正在使用jimfs在我的单元测试和DefaultFileSystem getFileSyst
  • 模拟 RSpec 单元测试中的竞争条件

    我们有一个异步任务 它对对象执行可能需要长时间运行的计算 然后结果缓存在对象上 为了防止多个任务重复相同的工作 我们添加了带有原子 SQL 更新的锁定 UPDATE objects SET locked 1 WHERE id 1234 AN
  • API 的集成与单元测试

    我们可以考虑向端点 单元或集成测试 发送请求吗 import lib from testing lib const testClient expect lib const response testClient request app ge
  • 测试框架允许测试依赖于其他测试

    我想知道是否有一个测试框架允许将测试声明为依赖于其他测试 这意味着如果它们所依赖的测试未通过 则不应运行它们 或者不应突出显示它们的结果 这种设置的目的是在存在许多测试失败的情况下更容易确定根本原因 作为奖励 如果有某种方法可以使用一个测试
  • Robolectric 未正确处理 getApplicationContext() - NPE

    我一直在使用 Robolectric 在 Android 应用程序上运行一些测试 到目前为止它运行良好 我的应用程序将 getApplicationContext 的结果传递给构造函数 但 Robolectric 应该确保该值不为 null
  • 使用 Maven 对 Android 进行单元测试

    我有一个关于使用 Maven 构建的 android 项目的问题 我们让它运行我们的活动测试 但现在我们需要它来运行单元测试 单元测试与活动测试位于同一项目中 我如何在 pom xml 文件中设置它 这是父 Pom xml 文件
  • 在测试设置和拆卸中重定向 Console.Out

    这是后续获取从单元测试中发送到 Console Out 的输出 https stackoverflow com questions 2139274 grabbing the output sent to console out from w
  • AngularJs 单元测试 - 检查是否调用了“Init”函数

    我使用 jasmine 作为测试框架 并且我想测试以下控制器 我总是有一个 Init 函数 我可以在其中对此控制器进行初始化调用 现在我想测试控制器初始化时是否调用了 Init 函数 function UnitTestsCtrl var t
  • 如何模拟类路径上属性文件的存在?

    这肯定是一个常见问题 我有一个像这样的属性文件my settings properties由应用程序类读取 当我编写测试类时 它需要测试可能存在的不同场景my settings properties为了确保最大的代码覆盖率 例如空属性文件
  • Grails 测试中的模拟配置

    在 Grails 2 0 X 之前 可以使用mockConfig测试扩展的基类提供的方法 然而 在 Grails 2 0 X 中 建议测试类使用 TestFormixin 而不是扩展基类 这个 mixin 似乎没有提供任何与mockConf
  • C# 压力测试 - 模拟对给定共享资源的多次访问

    如何在 C 单元测试中模拟 压力测试 100 个用户访问给定的共享资源 例如数据库 假设您正在访问真实的数据库 那么您就处于集成测试的范围内 最简单的方法是从多个线程访问资源 例如 Test public void SimpleStress
  • 测试 Spring 端点时如何防止 NestedServletException?

    我在尝试着测试安全配置我的一些端点受到保护 PreAuthorize oauth2 hasScope scope 当使用不具有所需范围的访问令牌通过 Postman 访问此类端点时 将返回以下内容并带有 HTTP 状态代码 403 禁止 e
  • 将文件上传到S3的模拟测试用例

    我们如何模拟文件上传到 S3 我尝试过这样的事情 file mock mock MagicMock spec File name FileMock mock patch storages backends s3boto S3BotoStor
  • 使用单元测试项目中定义的 Startup 类时.NET Core TestServer 返回 404

    我有一个基本的 net core api web 应用程序和一个使用 TestServer 发出 http 请求的单元测试项目 我有一个 TestStartup 类 它是 api 项目中 Startup 类的子类 如果 Startup 类位
  • 如何为 Rust 测试中的所有测试函数创建一个具有作用域/生命周期的变量?

    我有一个在深入测试细节之前初始化变量的测试 我想使用相同的变量进行第二次测试 而不是重复初始化代码 test fn test one let root Path new data the rest of the test test fn t
  • Akka.net 和单元测试

    我想使用 Akka net TestKit 编写单元测试 但我有一个问题 我有一个 SubscriptionService 类 它负责将消息传输给选定的参与者 public class SubscriptionService Receive
  • 测试弱引用

    在 Java 中测试弱引用的正确方法是什么 我最初的想法是执行以下操作 public class WeakReferenceTest public class Target private String value public Targe
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 何时使用模拟框架?

    因此 我正在使用模拟框架 Moq 进行单元测试 并且想知道何时应该使用模拟框架 以下两个测试之间的优点 缺点是什么 public class Tests Fact public void TestWithMock Arrange var r
  • Coffeescript + 单元测试:全局变量?

    我正在尝试使用 Jasmine 对用 CoffeeScript 编写的小型应用程序进行单元测试 我发现很多资料都说单元测试可以在从 CoffeeScript 编译的 JS 上完美地完成 如果所有内容都包装在匿名函数中以避免污染名称空间 如何

随机推荐

  • 如何在Python中使用cv2和多重处理并行从视频中获取帧

    我一直在 python 中使用 cv2 和多处理 我终于有了一个工作脚本 一旦各个帧已经在输入队列中 它就会对它们进行处理 但是 我想首先通过使用多个核心来加快将帧放入队列的速度 因此我尝试使用相同的多处理方法将每个图像读入队列 但我似乎无
  • python 3.5 上的 PyHook

    我正在尝试在 python 上编写一个基本的键盘记录程序 我需要安装 pywin32 和 pyhook 模块 我已经成功安装了 pywin32 但似乎无法 pyhook 工作 我已经读到它可以在更高版本的 python 上工作 但似乎无法弄
  • Spring 3 MVC:动态表单中的一对多(在创建/更新时添加/删除)

    我正在寻找解决方案管理 HTML 表单中的一对多关系 using jQuery 我正在开发Spring 春季MVC and 休眠 我在网上找到了很多曲目 但没有任何有效的完整示例 的背景 我有三个 JPA 实体 Consult java 1
  • Erlang:分布式应用程序奇怪的行为

    我使用分布式 erlang 应用程序进行支付 配置和思路取自 http www erlang org doc pdf otp system documentation pdf9 9 分布式应用程序 我们有3个节点 n1 a2 X201 n2
  • 如何在 Android 中将 webview 捕获为位图?

    我有一个网络视图 我需要向下滚动才能查看所有内容 现在 我想要捕获整个网络视图到位图 我找了很多次 人们建议我使用该功能capturePicture 然而 这个函数是已弃用 那么 我还可以使用哪些其他方法来实现我的目标 谢谢大家 Andro
  • Xamarin WebView 缩放以适应

    有没有办法在 Xamarin 中设置 WebView 以默认缩放其内容以适合屏幕 并且仍然允许捏放大 缩小 我们将用它来显示我们在线的文档 我解决了自定义渲染器的页面缩放和缩放问题 如下所示 For IOS public class Cus
  • RcppArmadillo的sample()在更新R后不明确

    我通常使用一个简短的 Rcpp 函数 该函数将一个矩阵作为输入 其中每行包含 K 个概率 总和为 1 然后 该函数为每行随机采样一个 1 到 K 之间的整数 对应于提供的概率 这是函数 Rcpp depends RcppArmadillo
  • 如何在安装了 python 2 和 3 的情况下使用 pip? (操作系统)

    我正在尝试让 python 3 在我的 OSX 笔记本电脑上运行 我需要安装 python 3 的请求 但它不起作用 我想我已经成功地为 python 2 7 和 python3 安装了 pip 但是 每当我使用 pip 时 它都会指向 p
  • 替换文件内容中的字符串[重复]

    这个问题在这里已经有答案了 如何打开文件 Stud txt 然后将所有出现的 A 替换为 Orange with open Stud txt rt as fin with open out txt wt as fout for line i
  • 异步 Javascript 变量覆盖

    该代码存在一个问题 即调用异步函数时变量会被覆盖 如何解决 Code for x in files asynchronousFunction var1 var2 function console log x someVaraible 现在的
  • 如何使用 Contacts with Swift 对联系人进行排序

    我已经阅读了有关对联系人进行排序的苹果官方文档 尽管我不确定如何实现它 所以 这是获取请求 let fetchRequest CNContactFetchRequest keysToFetch keysToFetch 和我喜欢的排序顺序 l
  • 如何在 MacOS 上安装 Boost?

    如何在 MacOS 上安装 Boost 现在我找不到 Mac 版的 bjam 您可以使用以下方式获取最新版本的 BoostHomebrew brew install boost
  • 实体框架代码优先 - 来自同一个表的两个外键

    我刚刚开始使用 EF 代码 所以我是这个主题的初学者 我想在团队和比赛之间创建关系 1 场比赛 2 支球队 主队 客队 和结果 我认为创建这样的模型很容易 所以我开始编码 public class Team Key public int T
  • 无法将企业应用程序安装到未注册 UUID 的设备

    我创建了一个通用应用程序 我正在尝试使用我们的企业开发人员许可证分发该应用程序 问题是这样的 如果我在注册了 UUID 的设备上安装该应用程序 则该应用程序安装正常 如果我 尝试 在未注册 UUID 的设备上安装应用程序 则安装将无法完成
  • 过去 7 天的 Sqlite SELECT *

    我正在尝试执行 SELECT 来检索 SQLite 中过去 7 天的行 表结构如下 CREATE TABLE session rowID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL steps IN
  • Swift 通用数组函数查找不匹配项的元素的所有索引

    Swift 3 尝试编写一个通用数组扩展来获取不等于值的项目的所有索引 example let arr String Empty Empty Full Empty Full let result Int arr indexes ofItem
  • 在 Vue 模板中使用“this”?

    我脑子里一片混乱 我不知道为什么我看到了我们可以使用的地方this在 Vue js 模板中 现在我不知道我必须使用哪个 我在这里测试一些案例 new Vue el app data function return myVar test me
  • 打印具有长水平表格的页面的样式表

    我有一个页面可以在长水平表中吐出数据库数据 我需要把它打印得很好 这样它就不会被切断 有小费吗 将表格更改为多行水平表格 交换行 列 建议用户切换到横向模式 AFAIK 在当前的浏览器中没有办法以编程方式做到这一点 CSS3 定义 page
  • Pygame 中正在进行的两个音乐曲目之间的淡入淡出

    我的意图是两首音乐曲目 性质相似 彼此之间淡出在不同的时间 当发生这种淡入淡出时 一个音乐曲目应在短时间内从最大音量淡入静音 同时另一首曲目应从 0 淡出到 100 并继续播放从同一时间索引 他们必须能够做到这一点动态地任何时候 当某个动作
  • 如何使用MOQ框架为抽象基类创建Mock?

    我想为 MyClass 编写单元测试 但它的基类是一个抽象类 public class MyClass AbstractBaseClass 我想模拟抽象基类 以便在创建要测试的 MyClass 实例时可以跳过其构造函数中的一些逻辑 无论如何