如何创建一个接受lambda表达式的方法

时间:2010-01-17 23:22:13

标签: c#-3.0 lambda

所以我发现自己一直在编写这段代码:


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

我真的不确定这是否在正确的轨道上,但希望有人可以指出我正确的方向。

由于

2 个答案:

答案 0 :(得分: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的用法,这意味着lambda没有参数。您还必须指定ArgumentNullException的泛型参数,因为编译器无法推断它。

答案 1 :(得分: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));

您需要指定type参数以指示要测试的异常类型。 () => ...语法是一个不带参数的lambda表达式。