Как я могу Moq метод, который имеет необязательный аргумент в своей подписи без явного указания его или с помощью перегрузки?


рассмотрим следующий интерфейс:

public interface IFoo
{
    bool Foo(string a, bool b = false);
}

попытка издеваться над ним с помощью Moq:

var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);

выдает следующую ошибку во время компиляции:

дерево выражений не может содержать вызов или вызов, который использует необязательные аргументы

я обнаружил, что проблема выше поднята как повышение в списке проблем Moq, и он, по-видимому, назначается выпуску 4.5 (всякий раз, когда это происходит).

мой вопрос: что мне делать, учитывая, что вышеизложенное не будет исправлено в ближайшее время? Являются ли мои параметры только для явного задания значения по умолчанию необязательного параметра каждый раз, когда я издеваюсь над ним (какой вид побеждает точку указания одного в первую очередь) или для создания перегрузки без bool (например, что я бы сделал до C# 4)?

или кто-нибудь сталкивался с более умным способом преодоления этой проблемы?

2 92

2 ответа:

Я считаю, что ваш единственный выбор прямо сейчас-это явно включить в разделе Foo.

Я не думаю, что это нарушает цель указания значения по умолчанию. Значение по умолчанию-это удобство для вызова кода, но я думаю, что вы должны быть явными в своих тестах. Скажем, вы могли бы опустить указание

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

public interface IFoo
{
    bool Foo(string a);

    bool Foo(string a, bool b);
}

сейчас оба метода доступны, и этот пример будет работать:

var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);