Как создать метод, который принимает лямбда-выражения - PullRequest
1 голос
/ 18 января 2010

Так что я постоянно пишу этот код:


[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" );
    }
}

Таким образом, вместо того, чтобы писать этот код снова и снова, я действительно хотел бы создать метод, который принимает лямбда-выражение, которое будет выполнять метод в блоке 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));

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 18 января 2010

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

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 голос
/ 18 января 2010

Следующее должно делать то, что вам нужно (я добавил параметр типа для 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));

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

...