Как вы получаете условное #if для работы при модульном тестировании? - PullRequest
0 голосов
/ 24 февраля 2009

это то, что я хотел бы сделать.

/// <summary>
        /// Gets the session factory.
        /// </summary>
        /// <value>The session factory.</value>
        public ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
#if(NUNIT)
                     _sessionFactory = Fluently.Configure()
                        .Database(SQLiteConfiguration.Standard
                                      .UsingFile(DbFile)
                                      .ShowSql())
                        .Mappings(m =>
                                  m.FluentMappings.AddFromAssemblyOf<ForeignFormat>())
                        .ExposeConfiguration(BuildSchema)
                        .BuildSessionFactory();

#else
                    _sessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2005
                              .ConnectionString(c => c
                                                         .Server(".\\sqlexpress")
                                                         .Database("mPort")
                                                         .TrustedConnection())
                                                         .ShowSql()
                                               )

                .Mappings(m => m
                                   .FluentMappings.AddFromAssemblyOf<ForeignFormat>())
                .BuildSessionFactory();
#endif
                }
                return _sessionFactory;

            }
        }

возможно ли условное #, если вы запускаете юнит-тест?

Ответы [ 5 ]

2 голосов
/ 24 февраля 2009

#, если - это директива компилятора, поэтому вам придется компилировать ваш код по-разному, когда вы собираетесь запускать тесты, и когда вы собираетесь запускать его «по-настоящему». Для этого вы можете определить флаги компилятора в настройках сборки проекта.

Но , я согласен со всеми, кто предположил, что это не очень хороший подход. Помимо других проблем, о которых упоминали люди, будет просто трудно постоянно перекомпилировать, когда вы захотите переключиться между выполнением модульных тестов и запуском реального приложения.

Инъекция зависимости или насмешка послужат вам гораздо лучше.

1 голос
/ 24 февраля 2009

Я бы посоветовал насмехаться над соединением БД, а не сорить #, если / # еще через ваш код (даже если это только в этом одном месте).

0 голосов
/ 24 февраля 2009

Почему бы вам не создать FakeSessionFactory в своих модульных тестах в дополнение к SessionFactory?

В модульных тестах вы передаете своему клиентскому классу экземпляр FakeSessionFactory, а в своем приложении вы предоставляете ему SessionFactory, чтобы он действительно обращался к БД.

        public ISessionFactory SessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                    _sessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2005
                              .ConnectionString(c => c
                                                         .Server(".\\sqlexpress")
                                                         .Database("mPort")
                                                         .TrustedConnection())
                                                         .ShowSql()
                                               )

                .Mappings(m => m
                                   .FluentMappings.AddFromAssemblyOf<ForeignFormat>())
                .BuildSessionFactory();
                }
                return _sessionFactory;
            }
        }

        public ISessionFactory FakeSessionFactory
        {
            get
            {
                if (_sessionFactory == null)
                {
                     _sessionFactory = Fluently.Configure()
                        .Database(SQLiteConfiguration.Standard
                                      .UsingFile(DbFile)
                                      .ShowSql())
                        .Mappings(m =>
                                  m.FluentMappings.AddFromAssemblyOf<ForeignFormat>())
                        .ExposeConfiguration(BuildSchema)
                        .BuildSessionFactory();

                }
                return _sessionFactory;
            }
        }
0 голосов
/ 24 февраля 2009

Не следует использовать разделы #if для отделения тестового кода от производственного кода. Вы хотите (и НУЖНО) протестировать производственный код.

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

Внедрение зависимостей - это метод, позволяющий отделить код, который вы разместили, от фактической реализации базы данных. Это означает, что вы можете внедрить файл или полностью фальшивый класс базы данных во время теста.

0 голосов
/ 24 февраля 2009

Я бы не рекомендовал эту методику для модульного тестирования. Вы никогда не должны помещать «тестовый» код в рабочий файл.

Вы должны изучить насмешливые объекты, чтобы получить желаемую функциональность от вашего BuildSessionFactory метода.

...