如何模拟dbcontext?

2024-04-01

我正在使用实体框架核心 1.0 rc2。这是班级。

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
        
    }
    public DbSet<Blog> Blogs { get; set; }
}

然后注入ApplicationDbContext到一个班级

public class BtnValidator
{
    private readonly ApplicationDbContext _dbContext;
    public BtnValidator(ApplicationDbContext dbContext)
    {
        _dbContext = dbContext;
    }
}

不知道如何在单元测试方法中模拟它。

[Fact]
public void Ensure_Proper_Btn_Validated_Return_True()
{
    var dbContext = mockup(ApplicationDbContext); //how

    var validator = new BtnValidator(dbContext);
    var results = validator.IsValid("1234");
    Assure.True(results);
}

EDIT

In BtnValidator,我有代码可以访问dbContext.

public IsValid(string ID)
{
    var results = _dbContext.Blogs.First(x => x.ID);
    // 
}

您可以抽象 DbContext 以使其可模拟。

public interface IDbContext {
    DbSet<Blog> Blogs { get; set; }
    //...other properties and members needed for db context
    int SaveChanges();
}

public class ApplicationDbContext : DbContext, IDbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) {

    }

    public DbSet<Blog> Blogs { get; set; }
}

然后您可以将合约注入到依赖类中

public class BtnValidator {
    private readonly IDbContext _dbContext;

    public BtnValidator(IDbContext dbContext) {
        _dbContext = dbContext;
    }

    public bool IsValid(string ID) {
        var result = _dbContext.Blogs.FirstOrDefault(x => x.ID == ID);
        return result != null;
    }
}

然后在单元测试中您可以模拟接口

[Fact]
public void Ensure_Proper_Btn_Validated_Return_True() {
    //Arrange
    var id = "1234"
    var blogsTestData = new List<Blog>(){ new Blog { ID = id } };
    var blogs = MockDbSet(blogsTestData);
    //Set up mocks for db sets
    var dbContext = new Mock<IDbContext>();        
    dbContext.Setup(m => m.Blogs).Returns(blogs.Object);

    var validator = new BtnValidator(dbContext.Object);

    //Act
    var results = validator.IsValid(id);

    //Assert
    Assure.True(results);
}

Mock<DbSet<T>> MockDbSet<T>(IEnumerable<T> list) where T : class, new() {
    IQueryable<T> queryableList = list.AsQueryable();
    Mock<DbSet<T>> dbSetMock = new Mock<DbSet<T>>();
    dbSetMock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(queryableList.Provider);
    dbSetMock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(queryableList.Expression);
    dbSetMock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(queryableList.ElementType);
    dbSetMock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator());
    dbSetMock.Setup(x => x.Create()).Returns(new T());

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

如何模拟dbcontext? 的相关文章

随机推荐

  • 如何使用 Eclipse Datasource Explorer 浏览 derby 内存数据库?

    对于单元测试 我使用 derby 内存数据库 测试运行时是否有机会使用 Eclipse Datasource Explorer 等工具连接到该数据库 我用谷歌搜索了很多 有时我发现了类似的东西 连接 URL jdbc derby local
  • 将 Firebase 主题消息与 Android 通知通道结合使用

    我有一个可以接收不同通知类型的应用程序 例如News and Podcast 目前它有两个简单的开关 用户可以在其中启用和禁用这些不同的通知类型 它的工作原理是订阅和取消订阅该类型相应的 Firebase 主题 明显的优势是设备仅接收用户想
  • 如何在 Google Cloud 上的 Kubernetes 中备份 Postgres 数据库?

    备份运行于其上的 Postgres 数据库的最佳实践是什么谷歌云容器引擎 https cloud google com container engine 我的想法是努力将备份存储在谷歌云存储 https cloud google com s
  • 比较 C 中 char[] 的相等性

    我有两个变量 char charTime TIME char buf SOMETHINGELSE 我想检查这两个是否相等 使用charTime buf不起作用 我应该使用什么 有人可以解释为什么使用 不起作用 这个动作在 C 和 C 中会有
  • fatal: 似乎不是 git 存储库

    当我的 Git 存储库 URL 正确时 为什么会收到此错误 fatal email protected cdn cgi l email protection gittest git does not appear to be a git r
  • 如何管理/删除我的 Azure 逻辑应用连接

    我们正在 Azure 中构建一个逻辑应用程序 它由 Office 365 新邮件项目和服务总线队列项目组成 我们无法解决的是如何管理 删除连接 任何建议将不胜感激 参考MSDN博客 https blogs msdn microsoft co
  • 用jquery查找字符串中最后一个单词的第一个字母(字符串可以有多个单词)

    嘿 有没有办法找到字符串中最后一个单词的第一个字母 这些字符串是 XML 解析器函数的结果 在each 循环内 我获取所有节点并将每个名称放入变量中 如下所示 var person xml find name find text 现在 pe
  • 如果 Woocommerce 上的购物车中有特定商品,请更改购物车商品价格

    我正在使用 WooCommerce 会员资格 并且希望向购买特定产品的首次会员提供免费会员资格 我可以让其中一些单独工作 但很难将它们全部组合在一起 他们必须购买的商品也有促销价 因此我也会检查日期以查看该商品是否在促销窗口中 那部分正在工
  • SVG 在 Android 中保留纵横比

    我在 Android 手机上遇到 SVG 缩放问题 我网站的几个部分是基于通过嵌入的 SVG 的宽度和高度尺寸 img 标签 所有浏览器 除了Android 4 1 2 原生浏览器 非 Chrome 正确 完美地缩放 SVG 不会扭曲纵横比
  • 如何在 FastAPI 中进行多处理

    在提供 FastAPI 请求时 我需要对列表中的每个元素执行一项 CPU 密集型任务 我想在多个 CPU 核心上进行此处理 在 FastAPI 中执行此操作的正确方法是什么 我可以使用标准吗multiprocessing模块 到目前为止我发
  • ROWID (oracle) - 有什么用吗?

    我的理解是 ROWID 是查询返回的结果中每一行的唯一值 为什么我们需要这个ROWID ORACLE中已经有ROWNUM了 有人在 SQL 查询中使用过 ROWID 吗 ROWID 是行的物理位置 因此 它是定位行的最快方法 甚至比主键查找
  • 在构建过程中将静态库链接到共享库?

    我在使用 GCC Linux 构建共享库时遇到问题 目前这个共享库是使用 GCC libtool 选项 shared 创建的 一切都很好 现在必须将两个额外的静态库 a 文件 添加到此共享库中 因为它们提供了共享库所需的一些功能 使用选项
  • 该通道未配置任何具有“发现”角色的对等方

    我正在尝试从 java Fabric SDK 进行事务处理 我能够从节点正确查询数据 但在执行事务时出现以下错误 org hyperledger fabric sdk exception ServiceDiscoveryException
  • 类型定义字符串中的元素数量与第 8 行 /home/a3598479/public_html/Register.php 中的绑定变量数量不匹配

    请帮我 我实际上并不使用 PHP 但我需要在我的登录 注册项目中使用 con mysqli connect name POST name username POST username password POST password state
  • iOS 启动图像不会显示在 iPhone 或模拟器上,但可在 iPad 上显示

    无论我使用资产目录还是传统方式 我都会遇到这个问题 所有情况下均使用 Xcode 5 1 1 我已经输入了所有图像 并且 Xcode 没有给出 您缺少 568 h 错误或任何其他信息 但是当我启动应用程序时 我的启动图像仅显示在 iPad
  • SQL Server 2005:可为空的外键约束

    我在表会话和用户之间有外键约束 具体来说 Sessions UID Users ID 有时 我希望 Sessions UID 为空 这可以被允许吗 每当我尝试这样做时 我都会遇到 FK 约束违规 具体来说 我通过 LINQ 将一行插入到 S
  • 单例模式与 Web 应用程序,不是一个好主意!

    我发现了一些有趣的东西 我在调试其他东西时幸运地注意到了它 我正在应用 MVP 模式 并制作了一个单例控制器以在所有演示文稿之间共享 突然我发现有些事件在第一次回发时被调用一次 如果有两次回发则调用两次 如果有100次回发则调用100次 因
  • JavaScript 错误:“不是构造函数”

    我使用backbone js以及jquery和underscore js 这是我的一些代码 它还没有做任何事情 奇怪的是 点击 url users 后没有错误 发生错误的唯一一次是当我单击转到不同的哈希 然后单击返回转到 users 时 这
  • 在Python中动态评估简单的布尔逻辑

    我有一些动态生成的布尔逻辑表达式 例如 A 或 B 和 C 或 D A 或 A 和 B A 空 计算结果为 True 占位符被替换为布尔值 我是不是该 将此信息转换为 Python 表达式 例如True or True or False a
  • 如何模拟dbcontext?

    我正在使用实体框架核心 1 0 rc2 这是班级 public class ApplicationDbContext DbContext public ApplicationDbContext DbContextOptions