Moh Rhino: Могу ли я использовать Stub (), когда одним из моих параметров является выражение <Func <T1, T2 >>? - PullRequest
6 голосов
/ 13 мая 2009

У меня есть метод на интерфейсе, который выглядит следующим образом, и я хочу заглушить его с помощью Rhino Mocks:

TValue GetPropertyOfExistingObject<TValue>(long id, Expression<Func<T, TValue>> propertyExpression);

Мой код, который выполняет заглушки, выглядит так:

var service = MockRepository.GenerateStub<IQuoteService>();
service.Stub(s => s.GetPropertyOfExistingObject(1, q => q.QuoteNumber)).Return(1234);

Обратите внимание, что одним из параметров в этом методе является Expression<Func<T1, T2>>, и эта заглушка не возвращает указанное значение. Я знаю, что могу сделать это с помощью WhenCalled (), но мне было интересно, должен ли Stub () работать с параметрами выражения или я просто что-то не так делаю.

Ответы [ 2 ]

3 голосов
/ 10 сентября 2009

Вы можете создать метод, который оценивает равенство между двумя выражениями:

public class ExpressionMatcher
{
    public static Expression<Action<T>> Matches<T>(Expression<Action<T>> action)
    {
        var methodName = ((MethodCallExpression) action.Body).Method.Name;
        return Arg<Expression<Action<T>>>.Matches(a => ((MethodCallExpression)a.Body).Method.Name.Equals(methodName));
    }
}

Затем измените свой оператор-заглушку, чтобы обернуть выражение в вызове в выражение соответствия:

service.Stub(s => s.GetPropertyOfExistingObject(Arg<int>.Is.Equal(1), ExpressionMatcher.Matches<Quote>(q => q.QuoteNumber))).Return(1234);
2 голосов
/ 13 мая 2009

Я думаю, что проблема связана с тем, как выражения проверяют равенство. Я только что провел быстрый тест в Snippet Compiler, и мои выражения никогда не оценивались одинаково:

    Expression<Func<int, string>> p = i => i.ToString();
    Expression<Func<int, string>> s = i => i.ToString();
    var b = p.Equals(s) || p == s;

(b было ложно для этого теста)

Вероятно, для того, чтобы ваш тест работал как есть, вам придется игнорировать фактическое значение второго параметра (которое может или не может быть приемлемым; если это неприемлемо, я думаю, вам придется идти по маршруту WhenCalled) .

...