用于asp.net nhibernate解决方案的Integration测试项目中的NullReferenceExpection

时间:2010-11-19 17:12:42

标签: asp.net unit-testing nhibernate fluent-nhibernate

我有一个带有fluentnhibernate的asp.net(网站)项目的.NET 3.5解决方案和它的测试项目(类库项目)。我已经在测试项目中引用了asp.net项目并且使用了所有fluentnhibernate / nhibenate dlls。

我无法理解的是,在一个webform(从浏览器命中)的运行中,让我们说Test.aspx,架构的构建是成功的,我可以看到我的数据库中的表。 这是我在Test.aspx.cs上调用的方法

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ISession session = SessionManager.Instance.OpenSession();
       SessionManager.BuildSchema(session);
    }
}

我碰巧在我的测试类的CanGenerateSchema方法中使用相同的方法,它总是失败

 [TestFixture]
public class CanGenerateSchemaTestSuite
{
    [Test]
    public void CanGenarateSchema()
    {
        ISession session = SessionManager.Instance.OpenSession();
        SessionManager.BuildSchema(session);
    }
}

这是我使用的SessionManager:

public sealed class SessionManager
{
    private readonly ISessionFactory _sessionFactory;


    public static ISessionFactory SessionFactory
    {
        get { return Instance._sessionFactory; }
    }


    private ISessionFactory GetSessionFactory()
    {
        return _sessionFactory;
    }

    public static SessionManager Instance
    {
        get { return NestedSessionManager._sessionManager; }
    }

    public ISession OpenSession()
    {
        return Instance.GetSessionFactory().OpenSession();
    }


    private static Configuration SaveConfigs;

    private SessionManager()
    {
        try
        {

            if (_sessionFactory == null)
            {
            //from the debugging the code breaks from here when trying to get connectionstring.
                string constring = ConfigurationManager.AppSettings["localdb"].ToString();
                FluentConfiguration configuration = Fluently.Configure()
                    .Database(
                        MsSqlConfiguration.MsSql2005.ConnectionString(constring))
                    .Mappings(m =>
                    {
                        m.FluentMappings.AddFromAssemblyOf<myproject.model.Request>();
                        m.FluentMappings.AddFromAssemblyOf<myproject.model.Route>();
                    })
                    .ExposeConfiguration((x) =>
                    {
                        SaveConfigs = x;
                        x.SetProperty("current_session_context_class", "thread_static");

                    });
                _sessionFactory = configuration.BuildSessionFactory();
            }
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);

        }

    }


    public static void BuildSchema(ISession session)
    {
        var export = new SchemaExport(SaveConfigs);
        export.Execute(false,true,false,session.Connection,null);
    }

    class NestedSessionManager
    {
        internal static readonly SessionManager _sessionManager = new SessionManager();
    }
}

因此,从我的评论中,访问连接字符串时会发生NullReferenceException。我没有解释为什么会发生这种情况。我确定这是某种陷阱,我无法克服它。如果有人能帮我一把,我将非常感激。谢谢你的阅读。

2 个答案:

答案 0 :(得分:1)

来自Test.aspx的

ConfigurationManager.AppSettings["localdb"]将从您的web.config文件中提取出来。

您的测试项目无法访问该文件(我假设您的测试与您的网站位于一个单独的项目中)。您应该能够通过使用正确的localdb设置将app.config文件添加到测试项目中来解决此问题,或者使用FluentNHibernate的流畅构建器,而不是使用配置字符串。

示例app.config文件:

<?xml version="1.0"?>
<configuration>
 <appSettings>
   <add key="localdb" value="yourconnectionstring" />
 </appSettings>
</configuration>

答案 1 :(得分:0)

如果ConfigurationManager.AppSettings["localdb"]返回的值为null,则.ToString()调用将导致NullReferenceException

确保“localdb”设置存在。