如何在TDD中为单元测试创建实体框架DbContext
本文关键字:创建 实体 框架 DbContext 单元测试 TDD | 更新日期: 2023-09-27 18:02:49
我正在学习测试驱动开发(TDD)的过程中,所以我可以在我已经开始的项目中使用它,但是我遇到了一个关于如何设置我想要做的特定类型的测试的问题。
这个场景是,我有一个视图,它允许某人编辑关于用户的信息(如用户名、名、姓等)。在许多情况下,他们正在编辑的用户已经存在于数据库中,所以当他们点击保存时,数据库中的信息会被那个视图的视图模型更新。
我想测试的是视图模型是否将此信息保存到数据库中。这是使用我在构造期间传递给视图模型的实体框架DbContext来完成的,这意味着我需要在单元测试中创建一个DbContext来传递给视图模型,以便更新和比较。
我想测试的Assert应该是这样的:
Assert.AreEqual(ViewModelFake.EditedUser.Username, DataBaseContextFake.Users.Find(1).Username);
在DbContext最初由单元测试创建之后,它用User填充它,然后在单元测试中更改User信息。在视图模型中测试的命令负责将这些编辑过的信息保存到数据库中,替换DbContext最初填充的内容。
在过去的两天里,我一直在寻找一个解决方案,但还没有找到做同样事情的人的例子。这种情况应该在单元测试中处理吗?请注意,我没有使用实体框架之上的存储库/工作单元层。
在工作中,在我们的项目中,我们创建了一个实体框架上下文的抽象。
假设我们有一个接口,我们称之为IMyCompanyContext,它公开了你从DbContext中使用的所有方法,包括SaveChanges ();方法。所有数据库映射的集合都使用iccollection接口通过此接口公开。Query提供程序理解我们的查询(它在运行时检查该接口背后是一个真正的DbContext)。不仅如此,您还可以使用控制反转方法,甚至可以使用DI容器来请求新的IMyCompanyContext。
如果你想测试这个,你只需要用一个伪上下文实现你的上下文,它暴露了一些你可以查询的列表