如何使用 NSubstitute 模拟 DbContext,然后添加/删除数据

2023-12-29

我需要模拟 EFDbContext. I use 这里的方法 https://stackoverflow.com/a/21075569/3959480而且效果很好。

// mock a DbSet
var mockDbSet = Substitute.For<DbSet<Foo>, IQueryable<Foo>>();
var data = new List<Foo>().AsQueryable();
((IQueryable<Foo>)mockDbSet).Provider.Returns(data.Provider);
((IQueryable<Foo>)mockDbSet).Expression.Returns(data.Expression);
((IQueryable<Foo>)mockDbSet).ElementType.Returns(data.ElementType);
((IQueryable<Foo>)mockDbSet).GetEnumerator().Returns(data.GetEnumerator());
// now add it to a mock DbContext
var mockContext = Substitute.For<MyDbContextClass>();
mockContext.Set<Foo>().Returns(mockDbSet);

但是在某些测试中我需要能够调用mockContext.Set<Foo>().Add(someFoo) and mockContext.Set<Foo>().Remove(otherFoo),以及底层添加/删除逻辑的工作。

我试过这个:

mockDbSet.When(x => x.Add(Arg.Any<Foo>())).Do(x => data.Add(x.Arg<Foo>()));

但它抛出Collection was modified; enumeration operation may not execute.

那么如何实现添加/删除功能呢?


您不想将其添加到集合中。您想要做的是检查它(添加/删除/等)是否被调用以及可能是用什么来调用的。

// arrange - check what it was called with. You place asserts in the body of the `Do` expression. Place this before your call that actually executes the code
mockDbSet.Add(Arg.Do<Foo>(foo =>
{
    Assert.IsNotNull(foo);
    // Assert other properties of foo
}));

// act


// assert. Make sure that it was actually called
mockDbSet.Received(1).Add(Arg.Any<Foo>());

如果你想添加一个Foo在稍后的测试中,您可以保留对List of Foo's.

// mock a DbSet
var mockDbSet = Substitute.For<DbSet<Foo>, IQueryable<Foo>>();
var fooList = new List<Foo>();
var data = fooList.AsQueryable();
// rest of your code unchanged

// add it from the code being tested through the mock dbset
mockDbSet.Add(Arg.Do<Foo>(foo =>
{
    fooList.Add(foo);
    // at this point you have to recreate the added IQueryable
    data = fooList.AsQueryable();
    // rest of code you had to add this to the mockDbSet
}));


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

如何使用 NSubstitute 模拟 DbContext,然后添加/删除数据 的相关文章

随机推荐

  • X11:通过命令行移动现有窗口?

    给定一个 X 客户端窗口 ID 有没有办法从命令行移动该窗口或更改其几何形状 xlsclients a Window 0x3000001 Machine ohm Name Terminal Icon Name foo Command foo
  • 将 DataGridView 值复制到 TextBox

    我试图得到这个问题的答案 但到目前为止没有任何帮助能够做到我想要的 我有这段代码 它的目的是查看所选行并将其列输出到相应的文本框中 private void DataGridView01 SelectionChanged object se
  • 为 REST-ful API 编写单元测试 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正计划为 RESTful API 编写单元测试 我想知道我应该采取的方法 我最关心的方面与数据库状态有关 我的理解是 每次测试的测试目标的
  • 关于垃圾回收。为什么我们需要调用System.gc();?

    当引用的对象不再可供任何变量使用时 会自动调用垃圾收集 但我想知道为什么当自动调用垃圾回收时我们要显式调用 System gc 我们什么时候调用 System gc 你不知道 正如你所说 垃圾收集是自动的 System gc 甚至不强制进行
  • Ajax - 500 内部服务器错误

    我正在尝试在工作中为这个项目学习AJAX 我有一个加载患者正在服用的药物的网站 我递归地调用此 AJAX 函数 以便它将附加一个包含单一药物和 7 天历史记录的新表 我在 FF 和 IE 中执行代码时遇到问题 在镀铬中工作得非常好 我收到了
  • Python3并行处理opencv视频帧

    我有一个视频文件 需要逐帧处理 然后需要在帧中显示结果 目前我正在按顺序进行处理并一一显示帧 现在我想并行处理帧而不是顺序处理 一旦处理了 X 个帧 则 cv2 imshow 必须出现 并且必须以正确的顺序显示已处理的帧 目前我的顺序代码如
  • 有没有办法在禁用按钮时防止文本变灰?

    当我将按钮设置为禁用时 文本变为灰色 之前为黑色 在我的窗口中 结果是当按钮被禁用时文本不可读 我翻遍了 NSButton NSButtonCell NSCell NSControl 的文档 但没有找到任何方法使文本保持黑色 你知道我该怎么
  • Kotlin编译器会编译java文件吗?

    我有一个包含 java 和 kt 文件的项目 Kotlin 编译器会同时编译 java 和 kt 文件 还是只编译我的 kt 文件 No kotlinc仅编译 Kotlin 文件 kt 混合语言项目需要将两者结合起来kotlinc and
  • Angular + VB.NET - 路由不起作用

    所以我正在开发一个使用 AngularJS 和用 VB NET 编写的 Web API 的项目 所有这些工作都很好 直到我们必须维护路由为止 以下代码来自我的 angularApp 它定义了路由 var angularApp angular
  • 如何在 Cloud Run 上使用 Stackdriver 日志记录

    我正在尝试让 stackdriver 日志记录在 Google Cloud Run 完全托管 中运行的简单 Go 应用程序正常工作 但在 CloudRun 日志中看不到 stackdriver 条目 我已经创建了最简单的演示应用程序 htt
  • 使用 minimax 进行 tic-tac-toe 游戏可以使用多少个线程?

    我们以 5x5 井字游戏为例 假设轮到我的人工智能了 然后 我做了 25 步 基本上每个单元格 当然 如果它是合法的 移动 为每次移动创建一个线程 总共 25 个线程 最多 在每次移动时调用 minimax 函数 然后当所有结果都来自每个线
  • Visual C++ 2008 Express 下载链接失效了? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我目前正在学习的编程课程使用 Visual C 2008 为了在家工作 我们可以选择获取 Express 版本 我在网站上找不到下载链接 微软的支持也
  • Android 地图 - 限制在 180 度

    我可以将 Google 地图 V2 Android 限制在 180 180 经度 如 iOS MapKit 吗 我不希望它环绕 因为我正在尝试实现 clusterin 算法 而 180 180 度分割会让它变得困难 我希望平移限制在红线处
  • AngularJS - 如何访问指令中 templateUrl 内定义的表单?

    我正在尝试访问指令内的表单以进行验证 因此我想访问 setPristine 但是 我似乎无法弄清楚如何获取使用 templateUrl 创建的表单 我有一个 plunker 在这里详细说明了这个问题 http plnkr co edit S
  • Java用奇怪的字符创建Redis键和内容

    我正在使用以下代码创建一个新的 Redis 密钥 和内容 private static final String KEY ESTADOS estados private HashOperations
  • 在没有管理员权限的 Windows 上安装 python 模块

    我的工作笔记本电脑没有管理员权限 我的机器上已经安装了python和pip 版本号如下 C Users banand AppData Local Programs Python Python36 Scripts gt python vers
  • VHDL:进程块内的多个上升沿检测

    我对 VHDL 以及一般的数字电路 还很陌生 我正在尝试使用 BCD 样式块实现两位数的计数器 该电路的外部有一些按钮 按下这些按钮时 会将感兴趣的数字加一 很像闹钟 这是一个异步操作 会在某种形式的编辑模式下发生 外部强制 我编写的代码在
  • 隐藏包中的实现文件

    我有一个名为spellnum 它可以用作命令行实用程序 它具有if name main 块 或者它可以像标准 Python 模块一样导入 该模块定义了一个名为Speller看起来像这样 class Speller object def in
  • Spring Boot启动后如何获取所有端点列表

    我有一个用 Spring Boot 编写的休息服务 我想在启动后获取所有端点 我怎样才能做到这一点 为此 我想在启动后将所有端点保存到数据库 如果它们尚不存在 并使用它们进行授权 这些条目将被注入到角色中 并且角色将用于创建令牌 您可以在应
  • 如何使用 NSubstitute 模拟 DbContext,然后添加/删除数据

    我需要模拟 EFDbContext I use 这里的方法 https stackoverflow com a 21075569 3959480而且效果很好 mock a DbSet var mockDbSet Substitute For