首页 > 解决方案 > 模拟 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。对于这种情况,我需要一些建议。

提前致谢。

标签: unit-testingentity-framework-core

解决方案


OP 中的链接也适用于 DbQuery 类型,因为您正在模拟提供程序。在这方面,DbSet 和 DbQuery 的工作方式相同。

有关该主题的先前答案,请参阅https://stackoverflow.com/a/56940311/2975810


推荐阅读