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

1 回答 1

4

您可以创建一个模拟版本IDbFactoryDatabaseConnection(这是您需要引入的接口),然后在模拟的设置中,在调用模拟时抛出异常Close(),然后在您的测试检查中抛出异常ExceptionMessageSuccess然后UserFriendlyMessage.

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

下面是一个使用 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();

当然,根据行业最佳实践,这也意味着您必须遵守 SOLID 原则,特别是 Dependency Inversion 原则,这意味着您将需要为 DbFactoryDatabaseConnection 类创建一个接口(我假设这是您的名称类),这就是我在上面的例子中展示的。

于 2012-05-16T09:36:44.997 回答