Moq: как вызвать метод-предикат внутри linq для запроса mocks? - PullRequest
2 голосов
/ 25 января 2012

По теме переполнения стека было несколько похожих вопросов, но я не нашел ничего, связанного с Moq как таковым.

То, что я пытаюсь сделать, - это заключить часть «где» в следующеезапрос:

MyObject o = (from mock in Mocks.Of<MyObject>() 
              where mock.Property == 1 
              select mock).First();

Так что я могу передать лямбда только с критериями (т.е. mock.Property == 1 часть).Моей первой (и, очевидно, неудачной) попыткой было следующее:

public static T GetMockOf<T>(Func<T, bool> predicate) where T : class
{
    T obj = (from mock in Mocks.Of<T>() 
             where predicate(mock)
             select mock).First();
    return obj;
}
// ...

MyObject o = GetMockOf<MyObject>( mock => mock.Property == 1 );

Это сбой, потому что предикат вызывается для бесконечного числа mock - бесконечное число раз - и код зависает.Я попытался переключиться на Предикат.Invoke () вместо предиката (), но это заканчивается NotSupportedException.

При поиске через Переполнение стека я заметил, что люди предлагают использовать выражения, LinqKit или Dynamic Linq для аналогичных задач,тем не менее, для новичка Linq, такого как я, очень сложно углубиться в эти темы.

Возможно ли то, что я пытаюсь достичь с помощью Moq?Если так, какой самый простой способ достичь этого?Не уверен, что это что-то меняет, но я использую моно для кодирования, а не оригинал .NET.

1 Ответ

1 голос
/ 25 января 2012

Это уже поддерживается Moq v4.

MyObject o = Mock.Of<MyObject>(mock => mock.Property == 1);
...