伪造数据库时,Effort-FirstOrDefault 返回 null

2024-06-30

我正在尝试为我的项目创建一些单元测试,经过大量挖掘后,我发现了 Effort,这个想法很棒,它模拟数据库而不是处理伪造 DBContext,顺便说一句,当使用复杂的模式。

但是,在我专门将用户的电子邮件添加到 Effort 创建的内存数据库中之后,我试图获取用户的电子邮件,以下是代码

MyContext contextx = new MyContext(Effort.DbConnectionFactory.CreateTransient());

var client = new Client
{
    ClientId = 2,
    PersonId = 3,
    Person = new Person
    {
        PersonId = 3,
        EMail = "[email protected] /cdn-cgi/l/email-protection"
    }
};
contextx.Client.Add(client); //<-- client got added, I checked it and is there

var email = contextx.Client.Select(c => c.Person.EMail).FirstOrDefault(); 

在上面的最后一行中,我无法返回电子邮件[电子邮件受保护] /cdn-cgi/l/email-protection相反,它总是返回 null。

有任何想法吗?


回答你的直接问题

对于你提出的具体问题,我建议两点:

  1. 看一眼contextx.Client.ToArray()并查看该集合中实际有多少成员。可能是Client集合实际上是空的,在这种情况下你确实会得到 null。或者,Client 集合中的第一个元素可能具有空值EMail.

  2. 如果您致电,行为会如何改变contextx.SaveChanges()在查询之前ClientDbContext 上的集合?我很好奇是否打电话SaveChanges将导致新插入的值存在于集合中。这确实不是必需的,但是 Effort 和DbContext.

EDIT: SaveChanges()事实证明这就是答案。

一般测试建议

由于您用“单元测试”标签标记了这个问题,因此我将根据我作为单元测试从业者和教练的十年经验提供一些通用的单元测试建议。Unit测试是关于单独测试应用程序的各个小部分。通常,这意味着单元测试一次仅与几个类交互。这也意味着单元测试不应依赖于外部库或依赖项(例如数据库)。相反,一个一体化测试同时测试系统的多个部分,并且可能对数据库等事物具有外部依赖性。

虽然这看起来像是对术语的争论,但这些术语对于将测试的实际意图传达给团队的其他成员非常重要。

在这种情况下,要么您确实想要对恰好依赖于 DbContext 的某些功能进行单元测试,要么您正在尝试测试数据访问层。如果您尝试编写直接依赖于 DbContext 的隔离单元测试,那么您需要打破对 DbContext 的依赖。我将在下面解释这一点打破对 DbContext 的依赖以下。否则,您实际上是在尝试集成测试 DbContext ,包括实体的映射方式。在这种情况下,我总是发现最好隔离这些测试并使用真实的(本地)数据库。您可能希望使用与生产中使用的数据库相同的本地安装数据库。通常,SqlExpress 工作得很好。将您的测试指向测试可能完全垃圾的数据库实例。让您的测试在运行每个测试之前删除任何现有数据。然后,他们可以设置所需的任何数据,而不必担心现有数据会发生冲突。

打破对 DbContext 的依赖

那么,当您的业务逻辑依赖于访问时,如何编写好的单元测试DbContext? 你不知道。

在我使用实体框架进行数据持久化的应用程序中,我确保访问DbContext包含在单独的数据访问项目中。通常,我将创建实现存储库模式的类,并且允许这些类依赖于DbContext。所以,在这种情况下,我会创建一个ClientRepository实现了一个IClientRepository界面。界面看起来像这样:

public interface IClientRepository {

    Client GetClientByEMail(string email);

}

然后,任何需要访问该方法的类都可以使用基本的存根/模拟/其他内容进行单元测试。无需担心嘲笑DbContext。您的数据访问层已包含在内,您可以使用真实的数据库对其进行彻底测试。有关如何测试数据访问层的一些建议,请参阅上文。

作为一个额外的好处,该接口的实现定义了查找Client在一个统一的地方通过电子邮件地址。这IClientRepository界面允许您快速回答这个问题:“我们如何查询Client我们系统中的实体?”

依赖于DbContext与允许域类依赖连接字符串并在各处使用 ADO.Net 代码的测试问题的规模大致相同。这意味着您必须创建一个包含真实数据的真实数据存储(即使使用假数据库)。但是,如果您拥有对DbContext在特定的数据访问程序集中,您会发现单元测试更容易编写。

就项目组织而言,我通常只允许我的数据访问项目引用实体框架。我将有一个单独的核心项目,在其中定义实体。我还将在核心项目中定义数据访问接口。然后,将具体的接口实现放入数据访问项目中。然后,解决方案中的大多数项目都可以简单地依赖于 Core 项目,只有顶级可执行文件或 Web 项目真正需要依赖于数据访问项目。

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

伪造数据库时,Effort-FirstOrDefault 返回 null 的相关文章

  • ListView 内的 TextBox 绑定到对象,双向绑定不起作用

    Edit 好吧 在尝试了无数次但没有成功之后 我创建了一个非常小的 Wpf 应用程序 您可以直接复制此代码 请注意 当您更改文本框中的值并按 测试 按钮时 这些值永远不会更新 我不明白为什么双向绑定不起作用 请帮忙 这是 xaml
  • 为什么禁止在后续私有派生类中简单提及基指针/引用?

    struct B struct D private B B fun return new D ok struct DD public D B foo return 0 error struct B B B is inaccessible 这
  • 如何在 C# 中检查互联网连接是否可用

    我为一家公司开发了一个软件 出于某种许可目的 我使用远程数据库来允许 禁止使用该软件 每次用户登录软件时都会应用此任务 如果互联网连接不存在或对远程数据库的查询失败 用户会收到错误 他无法登录软件并显示远程数据库http地址 我不希望他看到
  • 如何将流写入内存流?

    public void doprocess TcpClient client MemoryStream ms new MemoryStream Stream clStream client GetStream byte buffer 1 n
  • 如何从 appsettings.json 获取日期时间?

    我有 net core 5 0 应用程序并尝试从 appsettings json 获取 DateTime 应用程序设置 json TimeModel RestartDuration 27 10 2021 12 30 00 Code ser
  • 错误:LNK1120:5 个未解析的外部

    我试图在我的帖子中获取有关已安装应用程序的详细信息 而且 我收到以下错误 Code include
  • 当找到路由/url 但未找到其背后的资源时返回什么?

    当路由customer 1存在但customer搜索背后的资源 实体不存在时 我应该返回 404 吗 我的意思是路线存在 或者我应该返回一个 204 无内容 因为我找不到客户 结果为空 微软样本 public IHttpActionResu
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • C++14 中专门用于数组类型的分配器?

    为什么 c 14 中没有 std allocator 的数组模板专门化 当我自己尝试专门化 std allocator 时 我在实现 Construction 和 destroy 方法时遇到了死胡同 是这个原因吗 那么为什么 std all
  • Microsoft.Graph GetAsync() 无限期挂起

    介绍 我正在开发一个 ASP NET 应用程序 除其他外 它应该从 Azure Active Directory 检索用户 为此 我使用 Microsoft Graph 版本 1 14 0 预览库 可以找到该库here https www
  • 无锁“如果不为零则递减”

    我目前正在用 C 重新发明线程池的轮子 我已经消除了代码中的几乎所有锁 除了以下构造的多个实例之外 std atomic size t counter void produce counter void try consume if cou
  • 如何从 C 函数中返回多个值?

    如果我有一个产生结果的函数int和一个结果string 如何从函数中返回它们 据我所知 我只能返回一件事 这是由函数名称前面的类型决定的 我不知道你的是什么string是的 但我假设它管理自己的内存 您有两种解决方案 1 返回一个struc
  • 如何从源代码编译picoProlog?

    我是计算机科学专业的学生 正在学习 Prolog 逻辑编程 我发现了一个有趣的 Prolog 解释器 picoProlog http spivey oriel ox ac uk corner Logic Programming http s
  • EasyMock - 由于无法访问父类私有对象(i18n)而引发 NullPointerException

    A Class Parent4 private I18nUtils i18n Here Nullpointerexception occur public Parent4 SetText i18n getText HELLO B Class
  • 双击 C# 中的 Windows 窗体

    如何检测哪个鼠标按钮双击了表单 即左键 右键或中键 Updated 我使用的是 NET2 0 将最后点击的按钮存储在MouseUp事件 然后在双击事件中检查该事件 示例代码 MouseButtons lastButtonUp MouseBu
  • 在 C++ 中调用函数有多少开销?

    许多文献都谈到使用内联函数来 避免函数调用的开销 但我还没有看到可量化的数据 函数调用的实际开销是多少 即通过内联函数我们可以实现什么样的性能提升 在大多数架构上 成本包括将所有 或部分 或没有 寄存器保存到堆栈 将函数参数推送到堆栈 或将
  • 从枚举获取 DescriptionAttribute [重复]

    这个问题在这里已经有答案了 我有一个枚举 用于查找协调字符串值 其中一个枚举中有一个空格 因此我尝试使用描述属性来查找该值 在找到 DescriptionAttribute 后 我在转换回公共类时遇到问题 public class Addr
  • 如何在预处理器中检测X32 ABI或环境?

    X32是一个 ABIamd64 x86 64使用 32 位指针的 CPU 这个想法是将 x86 64 的较大寄存器集与 32 位指针产生的较小内存和缓存占用空间结合起来 它可提供高达约 40 的加速 看x86 x32 和 x64 架构之间的
  • 反序列化 jQuery 序列化表单

    我正在尝试将表单输入传递到 WebMethod 中并执行某些操作 我用了jQuery 序列化 http api jquery com serialize
  • 将 byte[] 作为文件打开,而不先将其实际保存为文件

    打开以 byte 形式存储在数据库中的 Word 文件的最佳方法是什么 我必须将一些文档存储在 Access 数据库中 Word 文件 2003 及更高版本 并存储在严格通过 CD 运行的应用程序上 不幸的是 它们必须位于数据库中 并且不能

随机推荐

  • 使用 mongo-go-driver 将结果转换为不带结构的 JSON

    我不想在将结果转换为 JSON 之前使用结构 假设我有一些结果 result err collection Find ctx filter options 我可以收集所有结果docs变量和最后的结果doc多变的 var doc bson R
  • 如何在 Java 中对密码进行哈希处理?

    我需要对密码进行哈希处理以存储在数据库中 我怎样才能在Java中做到这一点 我希望获取纯文本密码 添加随机盐 然后将盐和散列密码存储在数据库中 然后 当用户想要登录时 我可以获取他们提交的密码 从他们的帐户信息中添加随机盐 对其进行哈希处理
  • 如何在不在 iPython 笔记本中使用离线模式下的plotly进行绘图?

    我需要使用plotly绘制我的数据 但是这段代码没有给我任何结果 我显示我的数据 但没有任何数字 import plotly graph objs as go from plotly offline import download plot
  • LINQ - 与 Group By 结合并获得平均值

    SQL SELECT DeptId avg Marks FROM StudentTb s JOIN StudInDepartment d on s StudentId d StudentId GROUP BY DeptId 转换为 Linq
  • Java 中整数之间的除法

    我需要在Java中执行整数之间的除法 结果应该是浮点数 我可以用吗 它的符号 如 int integer1 1 int integer2 2 float quotient integer1 integer2 Could I do this
  • 如何链接到C 中的静态库?

    我使用 code blocks 来编译我的静态库 输出结果是一个libstatic a文件 现在 如何链接到我的库以使用已编译的函数 我尝试使用 include libstatic a 但我的项目无法编译 cc o yourprog you
  • jQuery淡入淡出重复

    我有一个图像 它希望在加载文档时自动淡入淡出 并且应该完成直到文档关闭 请帮帮我 这会做到这一点 function fader fadeIn slow function fadeItOut function fadeItIn fader f
  • 使用 Android 获取 Firebase 实时数据库中最后一个节点的数组元素

    如下图所示 我有一个数据库 表 名为fridge有一个孩子叫food food是一个可以包含一个或多个元素的数组 我想访问最后一个节点并获取食物元素并将它们添加到列表中 但我不知道该怎么做 感谢您的帮助 您可以按照docs https fi
  • _class 字段和 Spring Data couchbase

    因此 我试图找到一种方法来删除 重命名 并更改字段值 由 spring data couchbase 生成的文档中的 class 字段 因为该文档将由一个服务存储 并且很可能被某人使用完全不同 我正在使用 spring couchbase
  • 我应该根据当前的内部 api 创建公共 api

    我的项目是拥有公共网站和内容管理系统 CMS 我正在使用 Lambda 和 API Gateway 作为 api CMS 当前有一个 api GET 请求来获取下表中的所有数据 横幅 表 属性 id 字符串 主键 分区键 标题 字符串 is
  • lua模块未加载库

    背景信息 我是 lua 的新手 我想了解模块是如何工作的 但我试图将预先存在的模块加载到新脚本中并从命令行运行该脚本 Code 我有一个名为 main lua 模块的文件 看起来像这样 module package seeall Load
  • 在一定时间后自动更改 Firestore 中的字段值 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 I m working on Javascript and here s how s my data looks like 我想要的功
  • 多维向量

    如何创建 2D 矢量 我知道在二维数组中 我可以这样表达 a 0 1 98 a 0 2 95 a 0 3 99 a 0 4 910 a 1 0 98 a 1 1 989 a 1 2 981 a 1 3 987 如何使用 C STL Vect
  • 使用 Passport 进行 Node.js 身份验证:如果字段丢失,如何闪烁消息?

    我正在使用 Passport js 如果我的表单字段为空 我想显示一条消息 但我不知道该怎么做 因为如果缺少护照 则不会触发策略回调 我真的希望这个用例更加清晰 而且我不想修改护照 我感觉有办法 但不知道在哪里 我尝试使用路线的回调 app
  • 谷歌管理的虚拟机上的Websocket端口

    我尝试使用托管虚拟机通过端口 3000 运行 Web 套接字服务器 但我只能通过实例的 IP 连接到它 而不能通过我自己的域或 appspot 域连接到它 当我在端口 80 上访问应用程序时 我得到应用程序在端口 8080 上发送的正确响应
  • 为什么策略的“using”子句用于新行,而“with check”子句则用于更新语句?

    来自 Postgres制定政策 https www postgresql org docs current sql createpolicy html文档 UPDATE 策略接受 USING 表达式和 WITH CHECK 表达式 USIN
  • jquery - 查找仅包含文本而没有任何其他 html 标签的元素

    我需要使用 jquery 检查锚元素中是否只有文本 而不是任何其他标签 img b 或任何其他内容 a href TV a 应该可以找到 但是 a href img a or a href span TV span a 或任何其他 HTML
  • java 中操作系统的名称(不是“os.name”)

    我想知道如何获取 jvm 运行的操作系统类型 它也必须是 安全的 所以System getProperty os name 这并不是一个真正的选项 因为它可以通过 D 指令轻松规避 我所说的 安全 是指不容易被规避 它适用于桌面应用程序 用
  • 用于获取唯一元素名称的 XPath

    我想使用 XPath 获取 XML 文件中出现的所有元素的名称列表 但是 我不希望任何名称重复 因此不应匹配与前面的元素具有相同名称的元素 到目前为止 我已经得到 not local name local name preceding 这执
  • 伪造数据库时,Effort-FirstOrDefault 返回 null

    我正在尝试为我的项目创建一些单元测试 经过大量挖掘后 我发现了 Effort 这个想法很棒 它模拟数据库而不是处理伪造 DBContext 顺便说一句 当使用复杂的模式 但是 在我专门将用户的电子邮件添加到 Effort 创建的内存数据库中