2013-12-11 1 views
2

Я хотел бы высмеять свойство, которое я нашел, используя отражение, чтобы исключить случай, когда кто-то пытается получить от него. Проблема в том, что я не знаю тип ID. Ниже приведен пример того, что я пробовал:Макет свойства Getter Бросить исключение с помощью Reflection

internal static T CreateObjectWithExceptioningIDProperty<T>() where T : class 
{ 
    Type type = typeof(T); 
    var moq = new Mock<T>(); 
    var lambdaParameter = Expression.Parameter(type); 
    PropertyInfo idProperty = type.GetProperties().First(pi => pi.Name.Equals("ID")); 
    var lambdaBody = Expression.Property(lambdaParameter, idProperty); 
    dynamic func = Expression.Lambda(lambdaBody, lambdaParameter); 
    moq.Setup(func).Throws(new Exception()); // get RuntimeBinderException 
    return moq.Object; 
} 

В настоящее время я получаю RuntimeBinderException: 'object' does not contain a definition for 'Throws'. Что я делаю не так?

Это похоже на Moq and reflection, passing dynamically generated expression tree/lambda to moq и Create an Expression<Func<,>> using reflection.

+2

Ваш 'RuntimeBinderException' потому, что вы не можете использовать методы расширения на' типов dynamic' (с '' func' является dynamic', 'moq.Setup (FUNC)' слишком). Может быть, применить его к соответствующему типу или не использовать синтаксис метода расширения? –

+1

Это для модульного тестирования? Если это так, его код получает запах. – Maess

+0

Да, это для модульного тестирования, но это длинная история (устаревший код). – MageWind

ответ

1

Если вы нанесли результат Setup на номер IThrows, он работает. Я не уверен, почему он терпит неудачу, как у вас есть; возможно, потому что тип времени выполнения moq.Setup(func) обычно не отображается (это internal - Moq).

((IThrows)moq.Setup(func)).Throws(new Exception()); 
+0

Бьюсь об заклад, это потому, что 'Setup()' является методом расширения (как вы прокомментировали выше). – MageWind

+0

@MageWind на самом деле, я не думаю, что 'Setup' или' Throws' является методом расширения. Когда я написал комментарий, я догадался, что «Throws» был, но я был неправ там. –

0

Может

moq.Setup(x => x.Id).Throws(new Exception()); 

?

+0

Возможно, вы захотите добавить больше к своему ответу, особенно потому, что не уверены, что это правильно. – Andy

+0

вам не кажется, что некоторые –

+0

да, но это было бы работать, но я забыл упомянуть, что не буду знать имя свойства во время компиляции. – MageWind

Смежные вопросы