【发布时间】:2021-08-22 08:27:33
【问题描述】:
请帮助从上下文中模拟 FromSqlInterpolated 方法。 我有一个简单的方法:
public List<UserTag> PrintUserTag(string userId)
{
return this.context.UserTag.FromSqlInterpolated($"ctc_sp_UserTag {userId}").ToList();
}
我写了一个测试:
[Fact]
public void UserTagTest_ReturnsSuccessResult()
{
string userId = "7C8FFA01-94FC-42EA-9C43-5CA7FD0400D1";
List<UserTag> userTags = new List<UserTag>()
{
new UserTag()
{
Id = userId,
UserTagName = "TestName",
// ..... and others lines
}
};
var mockDbSet = userTags.AsDbSetMock();
mockContext.Setup(x => x.UserTags).Returns(mockDbSet.Object);
mockContext.Setup(a =>
a.Set<UserTag>().FromSqlInterpolated<UserTag>(It.IsAny<FormattableString>())).Returns(mockDbSet.Object);
var actual = this.repo.PrintUserTag(userId);
Assert.NotNull(actual);
// And other Asserts
}
并收到此异常:
Message:
System.NotSupportedException : Unsupported expression: ... => ....FromSqlInterpolated<UserTags>(It.IsAny<FormattableString>())
Extension methods (here: RelationalQueryableExtensions.FromSqlInterpolated) may not be used in setup / verification expressions.
如何模拟或重写这一行:
mockContext.Setup(a =>
a.Set<UserTag>().FromSqlInterpolated<UserTag>(It.IsAny<FormattableString>())).Returns(mockDbSet.Object);
【问题讨论】:
-
不要为此使用模拟。如果您想进行集成测试,请针对真实数据库(如 LocalDB 实例)进行测试,或者将您的测试提升到更高级别,您不测试具体的数据库层但使用接口提取数据访问,如果您愿意做真正的单元测试。请参阅this 了解更多信息。
-
你应该改为
mockDbSet.Setup(x => x.FromSqlInterpolated(...))。