2012-05-16 98 views
2

这里看似简单的一个。我如何使用单元测试来测试这个代码块的异常处理?单元测试异常处理

public DbFactoryResponseType Close() 
    { 
     DbFactoryResponseType dbFactoryResponse = new DbFactoryResponseType(); 
     try 
     { 
      if (m_isConnected) 
      { 
       m_isConnected = false; 

       if (m_hasRecordSet) 
       { 
        m_hasRecordSet = false; 

        m_dbFactoryDatabaseDataReader.Close(); 
        m_dbFactoryDatabaseDataReader.Dispose(); 
       } 

       m_dbFactoryDatabaseCommand.Dispose(); 
       m_dbFactoryDatabaseConnection.Close(); 
       m_dbFactoryDatabaseConnection.Dispose(); 

      } 

      dbFactoryResponse.ExceptionMessage = ""; 
      dbFactoryResponse.Success = true; 
      dbFactoryResponse.UserFriendlyMessage = "OK"; 

      return dbFactoryResponse; 
     } 
     catch (Exception ex) 
     { 
      dbFactoryResponse.ExceptionMessage = ex.Message; 
      dbFactoryResponse.Success = false; 
      dbFactoryResponse.UserFriendlyMessage = "Error: Error while attempting to close the database connection."; 

      return dbFactoryResponse; 
     } 
    } 

这里是我到目前为止,但我不知道如何使异常火让我测试输出。

/// <summary> 
    /// Test method to test closing a PosgreSQL database connection. 
    /// </summary> 
    [TestMethod] 
    public void TestClosePostgreSQLConnectionException() 
    { 
     const string connectionString = "Server=myIp;Port=myPort;Database=myDatabase;User Id=myUser;Password=myPassword;"; 

     const string provider = "Npgsql"; 

     DbProviderFactoryConnection aDbProviderFactoryConnection = new DbProviderFactoryConnection(connectionString, provider); 

     DbFactoryResponseType dbFactoryResponseType = aDbProviderFactoryConnection.Close(); 

     Assert.IsNotNull(dbFactoryResponseType); 

     Assert.AreEqual(false, dbFactoryResponseType.Success); 
    } 

回答

4

呼吁模拟,然后Close()在测试时,您可以创建IDbFactoryDatabaseConnection一个模拟的版本(这是,你将需要引入一个接口),然后在模拟的设置,抛出一个异常检查ExceptionMessage,SuccessUserFriendlyMessage

你这样做的方式是使用一个模拟框架,如Rhino Mocks或MoQ,或者你甚至可以创建一个你自己的模拟或存根。然后,在你的测试中,将类的模拟版本注入你的类构造函数(假设你使用构造函数注入而不是setter注入),然后你将能够控制你的模拟行为。

一个例子,使用最小起订量,你会怎么做,这是下面:

Mock<IDbFactoryDatabaseConnection> connectionMock = new Mock<IDbFactoryDatabaseConnection>(); 

DbProviderFactoryConnection aDbProviderFactoryConnection = new DbProviderFactoryConnection(connectionString, provider, connectionMock.Object); 

connectionMock.Setup(c => c.Close()).Throws<Exception>(); 

DbFactoryResponseType dbFactoryResponseType = aDbProviderFactoryConnection.Close(); 

当然,在同行业最佳做法,这也意味着你必须坚持SOLID原则,具体原则依赖倒置,这意味着您将需要为DbFactoryDatabaseConnection类创建一个接口(我假设这是您的类的名称),这正如我在上面的示例中所示。

+0

你有任何链接或例子,我将如何做到这一点? – CSharpened

+1

哦,是的,我将很快发布一个 –

+0

优秀。谢谢 – CSharpened