0

это то, что я хотел бы иметь возможность сделать.Как вы получаете #if условный для работы при модульном тестировании?

/// <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; 

      } 
     } 

можно ли #if условно, если вы используете единичный тест?

+0

В следующий раз, пожалуйста, попробуйте форматировать свой вопрос немного более аккуратно! – eleven81

ответ

2

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

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

Зависимость от инъекции или насмешки послужит вам намного лучше.

0

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

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

1

Я предлагаю высмеять соединение db вместо того, чтобы засорять # if/# else через ваш код (даже если это только в этом одном месте).

+0

Я знаю, что вы должны высмеять свой db для большинства ваших модульных тестов, но как вы протестируете фактическое взаимодействие с db? FluentNH построит поддельный db из ваших сопоставлений, таким образом, я могу запускать модульные тесты против «реального db» и быть в состоянии видеть запросы NHibernate, вытесненные logForNet –

0

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

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

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

+0

SQLite и fluentNH, похоже, генерируют поддельный db из ваших сопоставлений. Я хочу использовать поддельный db для модульных тестов и реального db для производственного кода. Я знаю, что это не лучшая практика. Я просто ищу способ протестировать взаимодействие с db, не используя производственную db –

+0

, вам не нужно вводить издеваемое db как таковое. Также можно ввести фальшивый db, как вы делаете в разделе #if, и вводите это. –

0

Почему вы не создаете 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

Спасибо ... Я рассмотрю это, но я использую шаблон UnitOfWork и этот код за оболочкой, поэтому его трудно продиктовать поведение, которое, как мне кажется, мое единственное решение - это инъекция зависимости –

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