2012-05-16 6 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

Вы можете создать макет версию IDbFactoryDatabaseConnection (который является интерфейсом, который вам нужно будет ввести), то в настройках вашего издеваться, бросить исключение при вызове Close() на макет, а затем в тесте проверьте ExceptionMessage, Success и UserFriendlyMessage.

То, как вы это делаете, это использовать насмешливую инфраструктуру, такую ​​как Rhino Mocks или MoQ, или вы даже можете создать макет или заглушку самостоятельно. Затем вы в своем тесте вводите макет версии класса в свой конструктор класса (предполагая, что вы используете инъекцию конструктора, а не инъекцию установщика), и тогда вы сможете контролировать поведение вашего макета.

Например, при использовании MOq, как вы могли бы сделать это следующим образом:

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

Конечно, в соответствии с отраслевой передовой практике это означает, что вы должны придерживаться ТВЕРДЫХ принципов, в частности принцип Dependency Inversion, что означает, что вам нужно будет создать интерфейс для класса DbFactoryDatabaseConnection (я предполагаю, что это имя вашего класса), что я показал в приведенном выше примере.

+0

Есть ли у вас какие-либо ссылки или примеры того, как я буду это делать? – CSharpened

+1

о, да, я отправлю его в ближайшее время –

+0

Отлично. Спасибо – CSharpened

Смежные вопросы