所以我发现自己一直在编写这段代码:
[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));
我真的不确定这是否在正确的轨道上,但希望有人可以指出我正确的方向。
由于
答案 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表达式。