Блок (интеграция) тест для кода, который взаимодействует с базой данных


Я пытаюсь создать некоторые (я считаю, это интеграция не полностью) тесты для кода, который взаимодействует с базой данных и я не уверен, что это правильный подход.

Буду признателен за любые комментарии и возможные улучшения.

Использование: VS2010 модульного тестирования

Это функции я хочу проверить:

public IDbConnection OpenThirdPartyDatabase(string path, string password)
{
    var provider = GetProvider(path, password);
    return DBObjectFactory.GetObject().GetConnection(provider.Name, true, true);
}

Функции, которые используются OpenThirdPartyDatabase

private static IDBProvider GetProvider(string path, string password)
{
    var providers = DBProviders.GetObject();
    var providerExists = providers.Cast<IDBProvider>().Any(dbProvider => dbProvider.Name == "MyProviderName");

    return providerExists ? providers.GetDBProvider("MyProviderName") : CreateProvider(path, password); 
}


private static IDBProvider CreateProvider(string path, string password)
{
    IDBProvider provider = new DBAccessProvider("MyProviderName", path, "", password);
    DBProviders.GetObject().Add(provider);

    return provider;
}


public IDbConnection GetConnection(string ProviderName, bool OpenConnection, bool UseConnectionPool)
{
    IDBProvider dbProvider = DBProviders.GetObject().GetDBProvider(ProviderName);
    if (dbProvider == null)
        throw new UndeclaredDBProviderException(ProviderName);
    else
    {
        IDbConnection newConnection = null;
        if ((connectionPool.ContainsConnection(ProviderName)) && (UseConnectionPool))
            newConnection = connectionPool.GetConnection(ProviderName);
        else
        {
            newConnection = dbProvider.GetConnection();
            if (UseConnectionPool)
                connectionPool.AddConnection(ProviderName, newConnection);
        }
        if ((OpenConnection) && (newConnection.State == ConnectionState.Closed))
            newConnection.Open();
        return newConnection;
    }
}

Тесты:

/// <summary>
/// Test Connection with valid path and password
/// </summary>
[TestMethod]
public void ThirdPartyConnection_Valid()
{
    var testConnection = _thirdPartyConnManager.OpenThirdPartyDatabase("Data\\test.mdb", "pass");
    Assert.AreNotEqual(testConnection, null);
}

/// <summary>
/// Test Connection With Invalid Password
/// </summary>
[TestMethod]
[ExpectedException(typeof(OleDbException),"Not a valid password.")]
public void ThirdPartyConnection_ShouldThrowOleDbException_InvalidPassword()
{
    var testConnection = _thirdPartyConnManager.OpenThirdPartyDatabase("Data\\test.mdb", "invalidpassword");
}

/// <summary>
/// Test Connection with invalid path
/// </summary>
[TestMethod]
[ExpectedException(typeof(OleDbException))]
public void ThirdPartyConnection_ShouldThrowOleDbException_InvalidPath()
{
    var testConnection = _thirdPartyConnManager.OpenThirdPartyDatabase("InvalidPath\\Data\\test.mdb", "pass");
}

/// <summary>
/// Test Connection String
/// </summary>
[TestMethod]
public void ThirdPartyConnection_ConnectionString()
{
    var testConnection = _thirdPartyConnManager.OpenThirdPartyDatabase("Data\\test.mdb", "pass");
    Assert.AreEqual(testConnection.ConnectionString,"Expected Connection String","Not expected Connection String");
}


7082
6
задан 25 мая 2011 в 09:05 Источник Поделиться
Комментарии
2 ответа

Я не претендую быть экспертом, но вот мой опыт.

Кроме того, я вижу, вы используете строковую константу "MyProviderName" в код и вам бы не мешало двигаться, что на константный строковый для легкого рефакторинга и будущие изменения.

Также я предлагаю вам использовать более общие "исключение ArgumentNullException" против создать свой собственный "UndeclaredDBProviderException" как вы хотите, чтобы захватить, что нулевой параметр был передан функции.

Я также предложил бы, чтобы вы запустить код через FxCop и исправить любые ошибки.

4
ответ дан 27 мая 2011 в 04:05 Источник Поделиться

Ваш тестовый код выглядит очень разумной. Комментарии Крам тоже уместно, но я думаю, что вы определенно на правильном пути.

1
ответ дан 16 июля 2011 в 09:07 Источник Поделиться