【发布时间】: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