Метод установки с массивом параметров - PullRequest
40 голосов
/ 01 ноября 2011

Я занимаюсь разработкой тестов для приложения. Есть метод с массивом 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;
});

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

Ответы [ 2 ]

67 голосов
/ 01 ноября 2011

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

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

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

это не то, что вам нужно.

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

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

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

По сути, params имеет значение только для компилятора C #, но не для moq.

12 голосов
/ 01 ноября 2011

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

...