【问题标题】:Testing Moq with Where Throws NotSupportedException使用 Where Throws NotSupportedException 测试最小起订量
【发布时间】:2020-07-25 07:34:32
【问题描述】:

我是 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));
        }
    }
}

我的 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

我无法理解这里的问题,任何帮助将不胜感激!

【问题讨论】:

标签: asp.net-mvc unit-testing moq


【解决方案1】:

我在这里猜测了一下,因为我们没有足够的架构,但是你不能直接模拟 LINQ Where 扩展,你不能模拟扩展方法。

听起来您的控制器依赖于存储库,并且您正在直接访问该存储库的 AspNetUserMessages 属性。如果是这种情况,只需使用现有项目列表设置AspNetUserMessages 以适应测试。 GetAllMessages 中的 Where 调用将正常工作。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多