Невозможно настроить функцию с параметром out с помощью лямбда-выражения - PullRequest
0 голосов
/ 14 февраля 2019

Я обнаружил множество вопросов к сообщению об ошибке, но не тот, который соответствует моему конкретному случаю.

У меня есть метод с этой подписью в реализации кэша:

public bool TryGet(TKey key, out TValue returnVal, Func<TKey, TValue> externalFunc = null)

У меня есть класс, полученный из TKey: CompositeKey и TValue: string.

Я пытаюсь смоделировать его для модульного тестирования следующим образом:

_cacheMock
    .Setup(x => x.TryGet(It.IsAny<CompositeKey>(), out It.Ref<string>.IsAny, It.IsAny<Func<CompositeKey, string>>()))
    .Returns((CompositeKey key, out string s, Func<CompositeKey, string> fetchOne) => { s = ""; return true; });

Я получаю ошибку компиляциидля строки .Returns:

"Невозможно преобразовать лямбда-выражение в тип 'bool', поскольку оно не является типом делегата"

Если я удалю "out"модификатор компилируется нормально - но, конечно, не совпадает с сигнатурой вызова, и я не могу получить значение out.

Есть ли способ исправить часть оператора Returns () без изменениясам метод TryGet ()?

1 Ответ

0 голосов
/ 14 февраля 2019

Это может работать для вас:

//define the callback delegate
delegate void TryGetCallback(CompositeKey key, out string str, Func<CompositeKey, string> func);

mock.Setup(x => x.TryGet(
        It.IsAny<CompositeKey>(), 
        out It.Ref<string>.IsAny, 
        It.IsAny<Func<CompositeKey, string>>()))
    .Callback(new TryGetCallback((CompositeKey key, out string str, Func<CompositeKey, string>  func) => 
    { 
        str = "foo bar"; 
    }))
    .Returns(true);

с такой настройкой вы можете архивировать то, что вы хотите

string actualValue;
bool result = mock.Object.TryGet(new CompositeKey(), out actualValue)
//actualValue = "foo bar", result = true
...