使用 Where Throws NotSupportedException 测试最小起订量
Testing Moq with Where Throws NotSupportedException
我是 asp 网络中最小起订量和单元测试的新手。让我直接深入研究。
我的测试函数如下:
namespace OfflineMessagingAPI.Tests
{
public class MessageTests
{
[Fact]
public void ShouldGetAllMessagesSentByAUser()
{
// Arrange Data ----
MessageRequest Request = new MessageRequest();
Request.From = "userVIP";
var listOfMessages = new List<AspNetUserMessage>();
listOfMessages.Add(new AspNetUserMessage {
From = Request.From,
To = "User1",
Text = "DummyTxt"
});
listOfMessages.Add(new AspNetUserMessage
{
From = "User2",
To = Request.From,
Text = "txt2"
});
var TranformedList = listOfMessages.AsQueryable();
// Setup database mocker
Mock<BlockedUsersAndMessages> mockRepo = new Mock<BlockedUsersAndMessages>();
mockRepo.Setup(x => x.AspNetUserMessages.Where(o => o.From == Request.From || o.To == Request.From)).Returns(TranformedList);
var controller = new MessageController(mockRepo.Object);
// Act ---
IEnumerable<AspNetUserMessage> messages = controller.GetAllMessages(Request);
// Assert ---
Assert.Equal(messages.AsQueryable(), TranformedList));
}
}
}
My Where 的 lambda 表达式查询为:
Where(o => o.From == Request.From || o.To == Request.From)
因为这就是我在 GetAllMessages 方法中调用它的方式。
当我 运行 这个测试时,我得到以下错误:
消息错误
Message:
System.NotSupportedException : Unsupported expression: ... => ....Where<AspNetUserMessage>(o => o.From == MessageTests.<>c__DisplayClass0_0.Request.From || o.To == MessageTests.<>c__DisplayClass0_0.Request.From)
Extension methods (here: Queryable.Where) may not be used in setup / verification expressions.
Stack Trace:
Guard.IsOverridable(MethodInfo method, Expression expression)
InvocationShape.ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList`1 arguments, Boolean exactGenericTypeArguments)
ExpressionExtensions.<Split>g__Split|4_1(Expression e, Expression& r, InvocationShape& p)
ExpressionExtensions.Split(LambdaExpression expression)
Mock.Setup(Mock mock, LambdaExpression expression, Condition condition)
Mock`1.Setup[TResult](Expression`1 expression)
MessageTests.ShouldGetAllMessagesSentByAUser() line 41
我无法理解这里的问题,任何帮助将不胜感激!
我在这里猜测了一点,因为我们没有足够的模式,但你不能直接模拟 LINQ Where
扩展,你不能模拟扩展方法。
听起来您的控制器依赖于存储库,而您正在直接访问该存储库的 AspNetUserMessages
属性。如果是这种情况,只需使用适合测试的现有项目列表设置 AspNetUserMessages
。 GetAllMessages
中的 Where
调用将正常工作。
mockRepo.Setup(x => x.AspNetUserMessages).Returns(TranformedList);
如果您想测试 Where
调用是否按预期工作,请创建一个测试,其中 AspNetUserMessages
具有与 Where
表达式匹配的现有项目。然后创建另一个没有的。添加测试,直到您对涵盖表达式感到满意为止。
我是 asp 网络中最小起订量和单元测试的新手。让我直接深入研究。
我的测试函数如下:
namespace OfflineMessagingAPI.Tests
{
public class MessageTests
{
[Fact]
public void ShouldGetAllMessagesSentByAUser()
{
// Arrange Data ----
MessageRequest Request = new MessageRequest();
Request.From = "userVIP";
var listOfMessages = new List<AspNetUserMessage>();
listOfMessages.Add(new AspNetUserMessage {
From = Request.From,
To = "User1",
Text = "DummyTxt"
});
listOfMessages.Add(new AspNetUserMessage
{
From = "User2",
To = Request.From,
Text = "txt2"
});
var TranformedList = listOfMessages.AsQueryable();
// Setup database mocker
Mock<BlockedUsersAndMessages> mockRepo = new Mock<BlockedUsersAndMessages>();
mockRepo.Setup(x => x.AspNetUserMessages.Where(o => o.From == Request.From || o.To == Request.From)).Returns(TranformedList);
var controller = new MessageController(mockRepo.Object);
// Act ---
IEnumerable<AspNetUserMessage> messages = controller.GetAllMessages(Request);
// Assert ---
Assert.Equal(messages.AsQueryable(), TranformedList));
}
}
}
My Where 的 lambda 表达式查询为:
Where(o => o.From == Request.From || o.To == Request.From)
因为这就是我在 GetAllMessages 方法中调用它的方式。
当我 运行 这个测试时,我得到以下错误: 消息错误
Message:
System.NotSupportedException : Unsupported expression: ... => ....Where<AspNetUserMessage>(o => o.From == MessageTests.<>c__DisplayClass0_0.Request.From || o.To == MessageTests.<>c__DisplayClass0_0.Request.From)
Extension methods (here: Queryable.Where) may not be used in setup / verification expressions.
Stack Trace:
Guard.IsOverridable(MethodInfo method, Expression expression)
InvocationShape.ctor(LambdaExpression expression, MethodInfo method, IReadOnlyList`1 arguments, Boolean exactGenericTypeArguments)
ExpressionExtensions.<Split>g__Split|4_1(Expression e, Expression& r, InvocationShape& p)
ExpressionExtensions.Split(LambdaExpression expression)
Mock.Setup(Mock mock, LambdaExpression expression, Condition condition)
Mock`1.Setup[TResult](Expression`1 expression)
MessageTests.ShouldGetAllMessagesSentByAUser() line 41
我无法理解这里的问题,任何帮助将不胜感激!
我在这里猜测了一点,因为我们没有足够的模式,但你不能直接模拟 LINQ Where
扩展,你不能模拟扩展方法。
听起来您的控制器依赖于存储库,而您正在直接访问该存储库的 AspNetUserMessages
属性。如果是这种情况,只需使用适合测试的现有项目列表设置 AspNetUserMessages
。 GetAllMessages
中的 Where
调用将正常工作。
mockRepo.Setup(x => x.AspNetUserMessages).Returns(TranformedList);
如果您想测试 Where
调用是否按预期工作,请创建一个测试,其中 AspNetUserMessages
具有与 Where
表达式匹配的现有项目。然后创建另一个没有的。添加测试,直到您对涵盖表达式感到满意为止。