Moq to return one set of values on first invocation and then to return second set of values for all susequent invocations

Viewed 20

I have tried

Option 1

         var invocations = 0;
        _mockSqsMessageManager.Setup(x => x.GetMessages())
            .ReturnsAsync(() => invocations > 0 ? new List<SqsMessage>() : messages)
            .Callback(() =>
            {
                invocations++;
            });

Option 2

            _mockSqsMessageManager.Setup(x => x.GetMessages())
            .ReturnsAsync(messages)
            .Callback(() =>
            {
                _mockSqsMessageManager.Setup(x => x.GetMessages())
                    .ReturnsAsync(new List<SqsMessage>());
            });

Option 3

            var invocations = 0;
        _mockSqsMessageManager.Setup(x => x.GetMessages())
            .ReturnsAsync(messages)
            .Callback(() =>
            {
                invocations++;
                if (invocations > 0)
                {
                    messages = new List<SqsMessage>();
                }
            });

Option 4

        _mockSqsMessageManager.Setup(x => x.GetMessages())
            .ReturnsAsync(() =>
            {
                var invocations = _mockSqsMessageManager.Invocations.Count(x => x.MatchingSetup.Expression.Body.ToString() == "x.GetMessages()");
                return invocations > 0 ? new List<SqsMessage>() : messages;
            });

Option 5

            _mockSqsMessageManager.SetupSequence(x => x.GetMessages())
            .ReturnsAsync(messages)
            .ReturnsAsync(new List<SqsMessage>());

None have worked reliably. Option 5 works but if I only have the exact amount of invocations. I may have more than 100+ invocations so I can't use SetupSequence.

0 Answers
Related