请帮助模拟上下文中的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);发布于 2021-06-06 15:47:11
你不能直接模拟FromSqlInterpolated作为它的扩展方法。它在幕后调用DbSet<T> queryable提供程序上的CreateQuery<T>。
如果您不想设置集成测试,可以使用EntityFrameworkCore.Testing库,我是它的作者。如果你想自己尝试模拟它,我很乐意为你指出你需要的代码,但我需要知道你使用的EFCore版本是什么,因为实现方式不同。
集成测试与模拟是一个固执己见的话题。我同意微软的建议,你不应该模拟DbContext -它是一个复杂的依赖,你不拥有它,很难在模拟中模拟它的行为。一般来说,我使用内存中的提供程序,根据我的经验,它是一个可靠的伪提供程序,但它不能进行关系操作。
我将关系操作视为我可以控制的众所周知的依赖项--它们通常是我的存储过程或函数,我拥有它们--所以使用提到的库模拟它们没有问题。它们仍然需要在某些时候进行测试,但至少这样我有选择。
https://stackoverflow.com/questions/67834597
复制相似问题