A-A+

【NUnit】Exception Asserts (NUnit 2.5)

2014年12月27日 Nunit 【NUnit】Exception Asserts (NUnit 2.5)已关闭评论 阅读 472 次

Assert.Throws 作用于类本身,而不是比较值,它调用代理来验证抛代码片段出一个特定异常。

在一个类可中Assert成功时可以是返回一个Exception而不是void,下面的例子代表了几种使用方式。

Assert.Throws可以使用约束参数或者是异常类型作为预期的抛出异常类型。类型格式可以是泛型或者一般类型。

Assert.DoesNotThrow用于确认代理不会抛出异常。

Assert.Catch 与 Assert.Throws 相似,但是当一个异常派生意另一个异常是会通过。

Exception Assert.Throws( Type expectedExceptionType, TestDelegate code );
Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
        string message );
Exception Assert.Throws( Type expectedExceptionType, TestDelegate code, 
        string message, params object[] parms);

Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code );
Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
        string message );
Exception Assert.Throws( IResolveConstraint constraint, TestDelegate code, 
        string message, params object[] parms);

T Assert.Throws<T>( TestDelegate code );
T Assert.Throws<T>( TestDelegate code, string message );
T Assert.Throws<T>( TestDelegate code, string message, 
        params object[] parms);
        
void Assert.DoesNotThrow( TestDelegate code );
void Assert.DoesNotThrow( TestDelegate code, string message );
void Assert.DoesNotThrow( TestDelegate code, string message, 
        params object[] parms);

Exception Assert.Catch( TestDelegate code );
Exception Assert.Catch( TestDelegate code, string message );
Exception Assert.Catch( TestDelegate code, string message, 
        params object[] parms);

Exception Assert.Catch( Type expectedExceptionType, TestDelegate code );
Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
        string message );
Exception Assert.Catch( Type expectedExceptionType, TestDelegate code, 
        string message, params object[] parms);

T Assert.Catch<T>( TestDelegate code );
T Assert.Catch<T>( TestDelegate code, string message );
T Assert.Catch<T>( TestDelegate code, string message, 
        params object[] parms);

在上面的例子中TestDelegate void TestDelegate()的一个代理类型,用于执行验证问题的代码。在.NET2.0中可以使用匿名代理。如果在C#3.0中可能会是一个lambda表达式。

下面的例子显示了统一例子的几个方式:

[TestFixture]
public class AssertThrowsTests
{
  [Test]
  public void Tests()
  {
    // .NET 1.x
    Assert.Throws( typeof(ArgumentException),
      new TestDelegate(MethodThatThrows) );
      
    // .NET 2.0
    Assert.Throws<ArgumentException>( MethodThatThrows() );

    Assert.Throws<ArgumentException>(
      delegate { throw new ArgumentException(); } );

    // Using C# 3.0      
    Assert.Throws<ArgumentException>(
      () => throw new ArgumentException(); } );
  }
  
  void MethodThatThrows()
  {
    throw new ArgumentException();
  }

下面代码演示了使用返回值来验证异常:

[TestFixture]
public class UsingReturnValue
{
  [Test]
  public void TestException()
  {
    MyException ex = Assert.Throws<MyException>(
      delegate { throw new MyException( "message", 42 ); } );
    Assert.That( ex.Message, Is.EqualTo( "message" ) );
    Assert.That( ex.MyParam, Is.EqualTo( 42 ) ); 
  }

下面的例子使用包含了约束的重载来验证异常:

[TestFixture]
public class UsingConstraint
{
  [Test]
  public void TestException()
  {
    Assert.Throws( Is.Typeof<MyException>()
                 .And.Message.EqualTo( "message" )
                 .And.Property( "MyParam" ).EqualTo( 42 ),
      delegate { throw new MyException( "message", 42 ); } );
  }
}

使用适合自己的风格来撰写代码。

Exact Versus Derived Types

当使用Type作为参数是,Assert.Throws 需要抛出精确的类型。如果希望测试派生Type,使用以下允许指定约束的格式。可以二选一使用允许派生类型的Assert.Throws或者Assert.Catch。看如下例子:

// Require an ApplicationException - derived types fail!
Assert.Throws( typeof(ApplicationException), code );
Assert.Throws<ApplicationException>()( code );

// Allow both ApplicationException and any derived type
Assert.Throws( Is.InstanceOf( typeof(ApplicationException), code );
Assert.Throws( Is.InstanceOf<ApplicationException>(), code );

// Allow both ApplicationException and any derived type
Assert.Catch<ApplicationException>( code );

// Allow any kind of exception
Assert.Catch( code );
标签:

评论已关闭!

Copyright © 极品飞鸽 保留所有权利.   Theme  Ality 蜀ICP备14015766号-1

用户登录

分享到: