Тестирование Moq с использованием исключения NotSupportedException - PullRequest
0 голосов
/ 12 апреля 2020

Я новичок в Moq и модульное тестирование в asp net. Позвольте мне углубиться в это.

Моя тестовая функция выглядит следующим образом:

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 имеет запросы на лямбда-выражения как:

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

Я не могу понять проблему здесь, любая помощь будет так признательна!

1 Ответ

1 голос
/ 13 апреля 2020

Я предполагаю, что здесь немного, потому что нам не хватает схемы, но вы не можете смоделировать расширение LINQ Where напрямую, вы не можете смоделировать методы расширения.

Похоже, ваш контроллер зависит от репо, и вы напрямую получаете доступ к свойству AspNetUserMessages этого репо. Если это так, просто настройте AspNetUserMessages со списком существующих элементов в соответствии с тестом. Вызов Where в GetAllMessages будет работать как обычно.

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

Если вы хотите проверить, что вызов Where работает как положено, создайте тест, в котором AspNetUserMessages уже существует элементы, которые соответствуют выражению Where. Затем создайте другой, который не делает. Добавляйте тесты, пока не убедитесь, что вы закрыли выражение.

...