Visual studio 2008 在进行单元测试时,如何获得一个#if条件来工作?

Visual studio 2008 在进行单元测试时,如何获得一个#if条件来工作?,visual-studio-2008,unit-testing,nunit,conditional,if-statement,Visual Studio 2008,Unit Testing,Nunit,Conditional,If Statement,这就是我希望能够做到的 /// <summary> /// Gets the session factory. /// </summary> /// <value>The session factory.</value> public ISessionFactory SessionFactory { get {

这就是我希望能够做到的

/// <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(_sessionFactory==null)
{
#如果(NUNIT)
_sessionFactory=fluntly.Configure()
.Database(SQLiteConfiguration.Standard
.UsingFile(DbFile)
.ShowSql())
.Mappings(m=>
m、 FluentMappings.AddFromAssemblyOf())
.ExposeConfiguration(构建架构)
.BuildSessionFactory();
#否则
_sessionFactory=fluntly.Configure()
.数据库(MsSqlConfiguration.MsSql2005
.ConnectionString(c=>c
.Server(“.\\sqlexpress”)
.数据库(“mPort”)
.TrustedConnection())
.ShowSql()
)
.Mappings(m=>m
.FluentMappings.AddFromAssemblyOf())
.BuildSessionFactory();
#恩迪夫
}
返回工厂;
}
}

如果运行单元测试,是否可以#if conditional

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


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

我不建议将此方法用于单元测试。您不应该将“测试”代码放入生产文件中


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

我建议模拟db连接,而不是在代码中乱丢东西(即使它只在这一个地方).

我建议模拟db连接,而不是在代码中乱扔if/#else(即使它只在这一个地方)。

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

使数据库的类型/配置可配置可能更有意义。依赖注入是实现这一点的一种方法,而您似乎正在使用的castle框架就是为了方便地实现这一点而设计的

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

您不应该使用#if部分来分隔测试代码和生产代码。您希望(并且需要)测试生产代码

使数据库的类型/配置可配置可能更有意义。依赖注入是实现这一点的一种方法,而您似乎正在使用的castle框架就是为了方便地实现这一点而设计的

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

是一个编译器指令,因此您需要在运行测试时以不同的方式编译代码,而不是在“真正”运行测试时以不同的方式编译代码。可以在项目的生成设置中定义编译器标志来执行此操作

但是,我同意其他人的看法,他们认为这不是一个好办法。除了人们提到的其他问题外,当您想要在运行单元测试和运行实际应用程序之间切换时,不断地重新编译将是一件痛苦的事情

依赖项注入或模拟将更好地为您服务。

是一个编译器指令,因此您需要在运行测试时以不同的方式编译代码,而不是“真正地”运行代码。可以在项目的生成设置中定义编译器标志来执行此操作

但是,我同意其他人的看法,他们认为这不是一个好办法。除了人们提到的其他问题外,当您想要在运行单元测试和运行实际应用程序之间切换时,不断地重新编译将是一件痛苦的事情


依赖注入或模拟将更好地为您服务。

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

在单元测试中,您传递客户机类a 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;
            }
        }
公共ISessionFactory会话工厂
{
得到
{
if(_sessionFactory==null)
{
_sessionFactory=fluntly.Configure()
.数据库(MsSqlConfiguration.MsSql2005
.ConnectionString(c=>c
.Server(“.\\sqlexpress”)
.数据库(“mPort”)
.TrustedConnection())
.ShowSql()
)
.Mappings(m=>m
.FluentMappings.AddFromAssemblyOf())
.BuildSessionFactory();
}
返回工厂;
}
}
公共会话工厂伪造会话工厂
{
G