Setup Method With Params Array

c#, moq, nunit

Solution

You're trying to call a method taking a single string, rather than an array. Bear in mind that it's the C# compiler which handles the `params` part, converting calling code which just specifies individual values into a call passing in an array. As far as the method itself is concerned, it's just getting an array - and that's what you're mocking.

The compiler is actually turning your code into:

mock.Setup(m => m.GetFirstTicketInQueueIfMatches
                        (new string[] { It.IsAny<string>() }))

which isn't what you want.

You should use:

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string[]>()))

If you need to verify that it only gets given a single value, you'll need to do that in the same way you would for a non-params parameter.

Basically, `params` only makes a difference to the C# compiler - not to `moq`.

Problem

I am developing tests for an application. There's a method that has a `params` array as a parameter. I have set up the method using Moq but when I run the test, the return value of the method is null, which means it is not being mocked. Here's a code sample: ``` public interface ITicketManager { string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch); } public class TicketManager : ITicketManager { private Queue<string> ticketQueue = new Queue<string>(); public string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch) { var firstQueuedTicket = ticketQueue.Peek(); var firstQueuedTicketMatchesAnyOfRequested = ticketsToMatch.Any(t => t == firstQueuedTicket); if(firstQueuedTicketMatchesAnyOfRequested) return firstQueuedTicket; return null; } } ``` The mock code looks like this: ``` var mock = new Mock<ITicketManager>(); mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>())) .Returns(p => { if(p.Contains("A")) return "A"; return null; }); ``` Why is it never hitting the mocked method?

Original source