c# - 使用 NUnit 模拟 EF 的 ExecuteSqlCommand

标签 c# unit-testing asp.net-core entity-framework-core dbcontext

我正在使用 Entity Framework 核心。我指的是这里建议的代码之一:https://stackoverflow.com/a/41515103/9766215

public void SaveOrUpdate(MyEntity entity)
{
    var sql =  @"MERGE INTO MyEntity
                USING 
                (
                   SELECT   @id as Id
                            @myField AS MyField
                ) AS entity
                ON  MyEntity.Id = entity.Id
                WHEN MATCHED THEN
                    UPDATE 
                    SET     Id = @id
                            MyField = @myField
                WHEN NOT MATCHED THEN
                    INSERT (Id, MyField)
                    VALUES (@Id, @myField);"

    object[] parameters = {
        new SqlParameter("@id", entity.Id),
        new SqlParameter("@myField", entity.myField)
    };
    context.Database.ExecuteSqlCommand(sql, parameters);
}

我需要模拟 ExecuteSqlCommand,但此扩展方法不允许被 Moq 设置覆盖。我不想模拟整个方法 SaveOrUpdate。 请建议是否有任何方法可以使用任何数据库上下文方法来模拟或设置它以进行单元测试。我使用 UseInMemoryDatabase 进行单元测试数据库上下文。

最佳答案

您需要模拟您的方法而不是 EF 核心实现。您可以使您的方法虚拟并使用 Moq 模拟它的实现:

public virtual void SaveOrUpdate(MyEntity entity)
{
    var sql =  @"MERGE INTO MyEntity
                USING 
                (
                   SELECT   @id as Id
                            @myField AS MyField
                ) AS entity
                ON  MyEntity.Id = entity.Id
                WHEN MATCHED THEN
                    UPDATE 
                    SET     Id = @id
                            MyField = @myField
                WHEN NOT MATCHED THEN
                    INSERT (Id, MyField)
                    VALUES (@Id, @myField);"

    object[] parameters = {
        new SqlParameter("@id", entity.Id),
        new SqlParameter("@myField", entity.myField)
    };
    context.Database.ExecuteSqlCommand(sql, parameters);
}

然后模拟该方法的实现。

看看以下帖子:

https://entityframework.net/knowledge-base/26014969/how-to-moq-entity-framework-sqlquery-calls

How to Moq Entity Framework SqlQuery calls

关于c# - 使用 NUnit 模拟 EF 的 ExecuteSqlCommand,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60484172/

相关文章:

c# - 等待任务完成,在 'await' 之后进行操作

unit-testing - 从 2.2.4 升级到 Grails 2.4.3 后,在单元测试期间,元类更改不会在测试之间重置

unit-testing - 如何覆盖 Spring @Autowired 的行为

缺少 cookie 时,.NET 核心返回 500 而不是 401

asp.net-core - Ocelot API 网关仅设置 TimeOut 值抛出错误

c# - global.asax 和 Web 部署项目的编译器问题

c# - 如何在 DB 和 ORM 中为已知和未知日期部分的混合设计出生日期

c# - 修改现有的 AutoMapper 类型映射(用于单元测试)

c# - Asp .Net Core 单元测试模拟 UserManager.CreateAsync 并返回身份结果

c# - SerialPort.Open() --IOException -- "The parameter is incorrect."