让我们假设我有以下项目结构:
解决方案
|——比;Read.User(项目)
| |--& gt;Model
| |——>User.cs
| |--& gt;
| |——>ReadUserContext.cs
|——比;Write.User(项目)
| |--& gt;Model
| |——>User.cs
| |--& gt;
| |——>WriteUserContext.cs
下面的结构允许我将对域对象进行一些更改的写模型与仅从DB获取值的读模型分开,并且还有一个重要的信息是,我不能使用ReadonlyContext保存数据,所有的SaveChanges方法都覆盖了NotImplementedException,我不会改变,因为我们的架构的保护级别。
我正在努力为以下架构创建一个测试。
现在使用InMemoryDatabase它有一些我必须克服的限制。
让我们假设测试应该看起来像:
- 使用Factory创建写上下文
- 将用户添加到WriteDbContext Users DbSet
- Save Changes on WriteDbContext
- 使用Factory创建只读上下文
- 从users DbSet
中检索所有用户
下面的示例将返回0个Users。为什么?首先,因为它是InMemoryDatabase我必须提供TheInMemoryDatabaseRoot让它们共享相同的数据,但接下来我遇到了最大的问题。
当我试图从ReadonlyDbContext中读取数据时,我正在使用从以下项目中的用户类创建的Users DbSet,但是我在测试的第二步中添加并保存在第三个用户上的用户DbSet上发生了在写项目中使用用户类.
InMemoryDatabase将这些dbset识别为单独的"表";在真实数据库中,它们是同一个表。
我有问题要问你们。是否有任何方法可以在InMemoryDatabase上做到这一点,或者我应该移动到真实的数据库来创建这种测试?
自2022年起,Microsoft建议使用您的生产数据库引擎而不是内存中的double。我建议您阅读关于测试核心应用程序的整个章节以获得详细信息:
https://learn.microsoft.com/en-us/ef/core/testing/