假设我已经编写了一个扩展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)?
答案 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.