unit-testing - 模拟 DbQuery 以从单元测试中使用 FromSql
问题描述
我在项目中使用 EF Core 来获取存储过程调用。在我的上下文中,我有以下内容:
public class MyContext : DbContext
{
public DbQuery<User> UserQuery { get; set; }
public MyContext(DbContextOptions<MyContext> options) : base(options) { }
}
我这样调用存储过程:
public virtual async Task<User> GetUserAsync(string name)
{
return await MyContext.Query<User>()
.FromSql($"EXEC [dbo].[GetUser], @Login = {name}")
.FirstOrDefaultAsync();
}
代码工作正常。我需要在单元测试中测试这个方法,我正在使用 InMemoryDatabase 来模拟我的上下文 MyContext ,如下所示:
[Fact]
public async Task GetUserAsync_should_return_first_user_with_login_and_password_if_exists()
{
// Arrange
var users = new List<User>
{
new User()
{
Login = "test@outlook.fr",
Password = "pass1",
},
};
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(databaseName: "BddName")
.Options;
var context = new MyContext(options);
var loginProvider = A.Fake<LoginProvider>(opts => opts.WithArgumentsForConstructor(() => new LoginProvider(context)));
// Act
// Assert
context.Dispose();
}
而且我不知道如何将我的列表设置为从 DbQuery 调用的存储过程的结果。我尝试关注这篇文章:https : //nodogmablog.bryanhogan.net/2017/11/unit-testing-entity-framework-core-stored-procedures/ 但它仅适用于 DbSet 而不是 DbQuery。对于这种情况,我需要一些建议。
提前致谢。
解决方案
OP 中的链接也适用于 DbQuery 类型,因为您正在模拟提供程序。在这方面,DbSet 和 DbQuery 的工作方式相同。
有关该主题的先前答案,请参阅https://stackoverflow.com/a/56940311/2975810。
推荐阅读
- java - Scala 12.x 和 Java 11 `String.lines`,如何在链式调用中强制进行隐式转换?
- swift - 如何在 Swift 中为 Radio Live Streaming 服务实现 HLS
- python - Django注册进度条
- maven - 是否可以在 CLI 中添加 MVN 选项?
- r-lavaan - 使用多个 DV 在 lavaan 中进行调解
- python - 无法脱离登录系统
- android - Appium。如何在具有 `android:launchMode="singleInstance"` 标志的活动上查找元素?
- java - 如何正确保存关联实体?
- php - WordPress PHP 警告:需要(/home/cluster-sites/6/e/expertfaculty.org/public_html/wp-includes/class-wp-widget.php):无法打开流
- git - 查找 git 中的所有子模块及其提交