Как протестировать реализацию моих репозиториев?

Я использую NUnit для тестовых модулей. У меня есть свой интерфейс в домене, поэтому я готов реализовать эти интерфейсы на уровне сохраняемости. Мой вопрос: как вы на самом деле делаете модульные тесты для тестирования этих репозиториев? я считаю, что это не очень хорошая идея для тестирования непосредственно из базы данных. Я слышал, что люди используют SQLite, но вместо этого можно использовать макеты? почему люди используют SQLite для базы данных в памяти, когда вы можете предоставить макет с реальными объектами?

Любой пример тоже приветствуется.

Примечание. Это предназначено для репозиториев, написанных на C #, которые будут использовать NHibernate и Fluent NHibernate в качестве сопоставления.

Спасибо.


person Rushino    schedule 18.02.2011    source источник


Ответы (2)


Это, конечно, зависит, но в большинстве случаев я бы сказал, что обычно достаточно просто имитировать репозитории в ваших тестах и ​​использовать базу данных SQLite в памяти только для проверки ваших сопоставлений (Тестирование спецификации FluentNHibernate Persistence).

Для тестов сопоставления NUnit с SQLite я использую следующий базовый класс:

public abstract class MappingsTestBase
{
    [SetUp]
    public void Setup()
    {
        _session = SessionFactory.OpenSession();
        BuildSchema(_session);
    }

    [TestFixtureTearDown]
    public void Terminate()
    {
        _session.Close();
        _session.Dispose();

        _session = null;
        _sessionFactory = null;
        _configuration = null;
    }

    #region NHibernate InMemory SQLite Session

    internal static ISession _session;

    private static ISessionFactory _sessionFactory;
    private static Configuration _configuration;

    private static ISessionFactory SessionFactory
    {
        get
        {
            if (_sessionFactory == null)
            {
                FluentConfiguration configuration = Fluently.Configure()
                    .Database(SQLiteConfiguration.Standard.InMemory().ShowSql)
                    .Mappings(m => m.FluentMappings
                        .AddFromAssemblyOf<NHibernateSession>())
                    .ExposeConfiguration(c => _configuration = c);

                _sessionFactory = configuration.BuildSessionFactory();
            }

            return _sessionFactory;
        }
    }

    private static void BuildSchema(ISession session)
    {
        SchemaExport export = new SchemaExport(_configuration);
        export.Execute(true, true, false, session.Connection, null);
    }

    #endregion
}

Пример тестового класса сопоставления, полученного из приведенного выше базового класса, может выглядеть следующим образом:

[TestFixture]
public class MappingsTest : MappingsTestBase
{
    [Test]
    public void Persistence_Employee_ShouldMapCorrectly()
    {
        Category employee = new PersistenceSpecification<Employee>(_session)
            .CheckProperty(e => e.Id, 1)
            .CheckProperty(e => e.FirstName, "John")
            .CheckProperty(e => e.LastName, "Doe")
            .VerifyTheMappings();
        ...
        Assert.Equals(employee.FirstName, "John");
        ...
    }
}
person Martin Buberl    schedule 18.02.2011
comment
Спасибо большое. Будет полезно. Но один вопрос, как вы его используете? Вы получаете от него тестовый класс сопоставления? затем в настройке вы строите схему и избавляетесь от нее после тестов? просто интересно, куда мы прикрепим сопоставление. Спасибо. - person Rushino; 19.02.2011
comment
@Rushino Я обновил свой ответ, чтобы дать вам пример того, как можно использовать базовый класс. - person Martin Buberl; 19.02.2011
comment
Одна вещь, о которой следует помнить, выбирая путь SQLite, заключается в том, что он не найдет 100% проблем. Например, если вы используете конкретное ключевое слово db (скажем, oracle, ради аргумента) в имени таблицы или столбца, ваши тесты, поддерживаемые SQLite, пройдут, но не пройдут в рабочей среде. Тем не менее, мне по-прежнему нравится использовать SQLite — просто помните о недостатках, когда вы не используете тот же тип базы данных, который используется в производственной среде. - person Mark Simpson; 19.02.2011

Лично я бы провел функциональное тестирование репозиториев в реальной базе данных (возможно, SQL Express). Вы можете запускать эти тесты в CI только один раз в день.

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

EDIT: вышеизложенное предполагает, что ваши репозитории используются исключительно для доступа к данным; они в основном просто используют LINQ или HQL. Держите бизнес-логику подальше от них!

person TrueWill    schedule 18.02.2011