使用 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 属性。如果是这种情况,只需使用适合测试的现有项目列表设置 AspNetUserMessagesGetAllMessages 中的 Where 调用将正常工作。

mockRepo.Setup(x => x.AspNetUserMessages).Returns(TranformedList);

如果您想测试 Where 调用是否按预期工作,请创建一个测试,其中 AspNetUserMessages 具有与 Where 表达式匹配的现有项目。然后创建另一个没有的。添加测试,直到您对涵盖表达式感到满意为止。