Метод настройки с массивом 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;
});
Почему это никогда не наносит удар по методу?
Ответы
Ответ 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>()