0

これが私ができるようになりたいことです。

/// <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 は可能ですか?

4

5 に答える 5

2

#ifはコンパイラ ディレクティブであるため、テストを実行する場合と「実際に」実行する場合では、コードを異なる方法でコンパイルする必要があります。これを行うには、プロジェクトのビルド設定でコンパイラ フラグを定義できます。

しかし、これは良いアプローチではないと示唆している他のすべての人に同意します。人々が言及した他の問題は別として、単体テストの実行と実際のアプリケーションの実行を切り替えるときに、常に再コンパイルするのは面倒です。

依存性注入またはモッキングは、はるかに優れたサービスを提供します。

于 2009-02-24T19:43:17.323 に答える
1

コード全体に #if/#else を散らかす代わりに、db 接続をモックすることをお勧めします (たとえそれがこの 1 か所だけであっても)。

于 2009-02-24T19:34:48.797 に答える
0

SessionFactory に加えて、単体テストで FakeSessionFactory を作成してみませんか?

単体テストでは、クライアント クラスに FakeSessionFactory インスタンスを渡し、アプリケーションでは、クライアント クラスに SessionFactory を提供して、実際に DB にアクセスできるようにします。

        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;
            }
        }
于 2009-02-24T19:53:07.223 に答える
0

この方法論を単体テストに使用することはお勧めしません。「テスト」コードを本番ファイルに入れるべきではありません。

メソッドから目的の機能を取得するには、オブジェクトのモックを検討する必要がありますBuildSessionFactory

于 2009-02-24T19:34:00.310 に答える
0

#if セクションを使用して、テスト コードを運用コードから分離しないでください。本番コードをテストしたい(そして必要とする)。

データベースのタイプ/構成を構成可能にする方がおそらく理にかなっています。依存性注入はこれを行う 1 つの方法であり、使用していると思われるキャッスル フレームワークは、これを簡単に行うように設計されています。

依存性注入は、投稿したコードをデータベースの実際の実装から分離する手法です。これは、テスト時にファイルまたは完全に偽のデータベース クラスを挿入できることを意味します。

于 2009-02-24T19:35:45.283 に答える