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(即使它只在这个地方)。

于 2009-02-24T19:34:48.797 回答
0

我不会推荐这种方法进行单元测试。您永远不应该将“测试”代码放入生产文件中。

您应该研究模拟对象以从您的BuildSessionFactory方法中获得所需的功能。

于 2009-02-24T19:34:00.310 回答
0

您不应使用 #if 部分将测试代码与生产代码分开。您想要(并且需要)测试生产代码。

使数据库的类型/配置可配置可能更有意义。依赖注入是执行此操作的一种方法,您似乎正在使用的城堡框架旨在轻松执行此操作。

依赖注入是一种将您发布的代码与数据库的实际实现分离的技术。这意味着您可以在测试期间注入文件或完全伪造的数据库类。

于 2009-02-24T19:35:45.283 回答
0

除了 SessionFactory 之外,为什么不在单元测试中创建 FakeSessionFactory ?

在单元测试中,您向您的客户端类传递一个 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;
            }
        }
于 2009-02-24T19:53:07.223 回答