流畅的NHibernate单元测试

时间:2010-10-25 10:31:34

标签: c# unit-testing nhibernate fluent-nhibernate

假设我已经编写了一个扩展System.Web.Security.MempershipProvider的自定义成员资格提供程序。这就属于自己的项目。

覆盖ValidateUser方法如下所示:

IList<User> Users;
        using (ISession sess = NHibernateHelper.GetCurrentSession())
        {
            Users = sess.CreateQuery("select u from User as u where u.Username = :username and u.Password = :password")
                .SetParameter("username", username)
                .SetParameter("password", password)
                .List<User>();
        }
        if (Users.Count > 0)
        {
            return true;
        }
        else
        {
            return false;
        }

我在这里使用流畅的nhibernate,所以NHibernateHelper类处理ISession对象的配置。

我想使用NUnit对此方法进行单元测试。在运行测试时,如何让该方法使用不同的数据库配置(例如内存中的SQLite DB)?

1 个答案:

答案 0 :(得分:1)

使会话可以更改。

通常我会说构造函数依赖注入,但你不能用成员提供者(我认为)这样做。

所以相反,你可以覆盖的属性怎么样,像这样

public MembershipProvider()
{
  SessionProvider  = new DefaultSessionProvider();
}

public ISessionProvicer SessionProvider {get;set;}
...
IList<User> Users;
        using (ISession sess = SessionProvider .GetSession())

然后您可以在单元测试中覆盖ISessionProvider。

一个可能更好的想法是将要进行单元测试的部分与Membership Proivder隔离开来,例如一个名为UserLoginValidationService的类。

以下是使用Fluent NHibernate和内存数据库的更多信息:Fluent NHibernate gotchas when testing with an in memory database.