Как я могу 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 ответа:
Я считаю, что ваш единственный выбор прямо сейчас-это явно включить в разделе
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);