如何测试直接使用NHibernate的服务层?

时间:2011-12-14 16:50:19

标签: nhibernate testing service

您好,有人可以就如何测试直接使用NHibernate ISession的服务层给我建议吗?

public class UserAccountService : IUserAccountService
{
    private readonly ISession _session;

    public UserAccountService(ISession session)
    {
        _session = session;
    }

    public bool ValidateUser(string email, string password)
    {
        var value = _session.QueryOver<UserInfo>()
            .Select(Projections.RowCount()).FutureValue<int>().Value;

        if (value > 0) return true;
        return false;
    }
}

我选择直接使用NHibernate来处理简单的情况,例如简单查询,验证以及在数据库中创建/更新记录。因为我不希望在Nhibernate之上有像repository / dao层这样的抽象,这会给我的架构增加更多的复杂性。

2 个答案:

答案 0 :(得分:2)

无论您使用的是NH,都需要决定要在服务层上进行实际测试的内容。

在您的示例中,良好的第一个测试可能是测试您传递到服务方法中的电子邮件和密码是否实际用作会话中的检查。

在这种情况下,您只需要使用某种类型的模拟框架(如Rhino Mocks)来存储会话变量并设置期望,这些模拟框架需要预先确定的电子邮件和密码,然后返回预期的结果

对此的一些伪代码可能如下所示:

void ValidateUser_WhenGivenGoodEmailAndPassword_ReturnsTrue()
{
  //arrange
  var stubbedSession = MockRepository.GenerateStub<ISession>();

  stubbedSession
      .Expect(x => x.Query<UserInfo>())
      .Return(new List { 
          new UserInfo { Email = "johns@email.com", Password = "whatever" } });

  var service = new UserAccountService(stubbedSession);

  //act
  var result = service.ValidateUser("johns@email.com", "whatever");

  //assert
  Assert.That(result, Is.True);
}

答案 1 :(得分:0)

我认为您会发现以静态方式测试数据库交互很困难。我建议将职责委托给另一个层(这个层增加了你提到的复杂性),如果你认为功能足够重要,可以用来测试。