【问题标题】:C# Mocking Database.ExecuteSqlRawC# 模拟 Database.ExecuteSqlRaw
【发布时间】:2020-07-01 10:14:27
【问题描述】:

我正在尝试模拟 Database.ExecuteSqlCommand 但它提示我 Unsupported expression 无论如何我可以模拟存储库来模拟 dBContext.Database.ExecuteSqlCommand p>

Repository.cs

    private readonly Mock<DBContext> _dbContextMock;

    public ShippingBulkRepositoryTest()
    {
        _dbContextMock = new Mock<DBContext>(new DbContextOptionsBuilder<DBContext>().Options);
        _repository = new Repository(_dbContextMock.Object);
    }

public async Task deleteAllRecords(CancellationToken cancellationToken)
{
     try
     {
         dBContext.Database.ExecuteSqlCommand("DELETE FROM bulk");
         dBContext.SaveChanges();
     } catch (Exception ex)
     {
         Console.WriteLine(ex);
     }
}

RepositoryTest

 [Fact]
 public async Task deleteAllRecords_should_call_GetAllSortedByPlateAsync_onto_service()
 {
     //given
     var bulk = _fixture.Build<bulk>()
         .With(x => x.id, 1)
         .With(x => x.type, "bulk")
         .CreateMany(1);
     //_dbContextMock.Setup(x => x.Database.ExecuteSqlRaw(It.IsAny<string>()));

     //when
     await _repository.deleteAllRecords(default);

     //then
     _dbContextMock.Verify(x => x.SaveChanges(), Times.Once);
 }

错误

Message: 
Value cannot be null. (Parameter 'databaseFacade')

【问题讨论】:

  • 一般来说,你只模拟接口。 ExecuteSqlRaw 是一个扩展(不能模拟)。
  • 顺便说一句,这段代码有一些非常糟糕的做法。捕获所有异常(至少已记录)、java 风格的函数名称、未使用的参数、没有等待时的异步。
  • @Neil 感谢您的指出。让我处理你的评论。
  • 你在这里测试一个数据库,所以使用实际的数据库。如果您将测试称为“单元测试”,这并不意味着您应该模拟所有内容。根据需要调用您的测试,但要对问题中的方法进行有价值且可维护的测试 - 对实际数据库或内存提供程序进行测试,以防它支持原始 sql 查询。
  • @Fabio 我正在使用这个样板,开发人员在其中模拟存储库。因此,我试图跟随。 github.com/lkurzyniec/netcore-boilerplate/blob/master/test/…

标签: c# unit-testing .net-core


【解决方案1】:

最新版本的 EF 内核允许您使用 in-memory database provider 运行此类集成测试。

【讨论】:

  • 我正在尝试为此编写一个单元测试,因此对此进行了嘲笑。除了使用内存数据库提供程序之外,还有其他方法吗?
  • 没有。创建内存数据库提供程序的主要原因之一是因为有很多开发人员正在尝试做你正在做的事情并且失败了。只需使用提供的工具即可。
  • 感谢您指出我应该做什么并建议内存数据库。我设法让它工作。仍在尝试使用 .netcore。赞一个!
  • 不,请在此处阅读有关内存数据库的内容:docs.microsoft.com/en-us/ef/core/testing
猜你喜欢
  • 2010-09-17
  • 2013-09-15
  • 1970-01-01
  • 2022-01-22
  • 2020-04-29
  • 2011-03-04
  • 2018-10-22
  • 2011-11-10
  • 1970-01-01
相关资源
最近更新 更多