Подтвердить что ты не робот

Метод настройки с массивом Params

Я разрабатываю тесты для приложения. Есть метод, у которого в качестве параметра есть массив params. Я настроил метод с помощью Moq, но когда я запускаю тест, возвращаемое значение метода равно нулю, что означает, что он не подвергается насмешке.

Вот пример кода:

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;
    }
}

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

var mock = new Mock<ITicketManager>();

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>()))
    .Returns(p => { 
    if(p.Contains("A"))
            return "A";

    return null;
});

Почему это никогда не наносит удар по методу?

4b9b3361

Ответ 1

Вы пытаетесь вызвать метод с одной строкой, а не с массивом. Имейте в виду, что это компилятор С#, который обрабатывает часть params, преобразуя вызывающий код, который просто указывает отдельные значения в передаче вызова в массиве. Что касается самого метода, он просто получает массив - и это то, что вы издеваетесь.

Компилятор фактически превращает ваш код в:

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

который вам не нужен.

Вы должны использовать:

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

Если вам нужно проверить, что ему присваивается только одно значение, вам нужно сделать это так же, как и для параметра без параметров.

В принципе, params влияет только на компилятор С# - не на moq.

Ответ 2

Я считаю, что params string должен соответствовать It.IsAny<string[]>(), а не It.IsAny<string>()