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