2010-01-17 6 views
1

Так что я считаю себя писать этот код все время:Как создать метод, который принимает лямбда-выражение


[TestMethod] 
[Description("Asserts that an ArgumentNullException is thrown if ResetPassword(null) is called")] 
public void ResetPassword_Throws_ArgumentNullException_With_Null_Parameter() 
{ 
    try 
    { 
     new MembershipServiceProvider().ResetPassword(null); 
    } 
    catch (ArgumentNullException) 
    { 
     // ArgumentNullException was expected 
     Assert.IsTrue(true); 
    } 
    catch 
    { 
     Assert.Fail("ArgumentNullException was expected"); 
    } 
} 

Таким образом, вместо того, чтобы писать этот код снова и я бы очень хотел, чтобы создать метод, который принимает выражение Lambda, которое будет выполнять метод в блоке try.

Что-то вроде этого:


public void AssertExpectedException(Action theAction) where TException : Exception 
{ 
    try 
    { 
     // Execute the method here 
    } 
    catch (TException) 
    { 
     Assert.IsTrue(true); 
    } 
    catch 
    { 
     Assert.Fail(string.Format("An exception of type {0} was expected", typeof(TException))); 
    } 
} 

Так что я могу сделать что-то вроде этого:


var provider = new MembershipServiceProvider(); 
AssertExpectedException(provider => provider.ResetPassword(null)); 

Я действительно не уверен, если это находится на правильном пути, но, надеюсь, кто-то может указать меня в правильном направлении.

Thanks

ответ

2

Вы почти у цели. Вот что тест помощник должен выглядеть следующим образом:

public void AssertExpectedException<TException>(Action theAction) 
    where TException : Exception 
{ 
    try 
    { 
     // Execute the method here 
     theAction(); 
    } 
    catch (TException) 
    { 
     // The Assert here is not necessary 
    } 
    catch 
    { 
     Assert.Fail(string.Format(
      "An exception of type {0} was expected", 
      typeof(TException))); 
    } 
} 

И называть его:

var provider = new MembershipServiceProvider(); 
AssertExpectedException<ArgumentNullException>(() => provider.ResetPassword(null)); 

Обратите внимание на использование () => something что означает, что лямбда не имеет параметров. Вы также должны указать общий аргумент ArgumentNullException, потому что компилятор не может его вывести.

1

Следующее должно сделать то, что вам нужно (я добавил параметр типа для TException и вызов theAction).

public void AssertExpectedException<TException>(Action theAction) 
    where TException : Exception 
{ 
    try 
    { 
     theAction(); 
    } 
    catch (TException) 
    { 
     Assert.IsTrue(true); 
    } 
    catch 
    { 
     Assert.Fail(string.Format("An exception of type {0} was expected", 
      typeof(TException))); 
    } 
} 

Вы можете вызвать его с помощью следующего кода:

var provider = new MembershipServiceProvider(); 
AssertExpectedException<ArgumentNullException>(() => provider.ResetPassword(null)); 

Вы должны указать аргумент типа, чтобы указать, какой тип исключения для проверки. Синтаксис () => ... - это лямбда-выражение, которое не принимает никаких параметров.

+0

Отлично! Большое спасибо. – devlife

+0

Как выполнить действие с параметром? – devlife

+0

Извините за форматирование .... Если у меня есть это: общественного недействительными AssertExpectedException (Действие theAction) где TException: Исключение { theAction(); // Это не работает. } AssertExpectedException (а => a.DoSomething ("тест", 123);. theAction() не работает Мне нужно пройти по двум параметрам Как бы я. сделать это с действием , который передается в что-то вроде этого (хотя это не будет реально работать :-)): theAction (theAction.FirstParameter, theAction.SecondParameter) – devlife

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