2011-12-14 4 views
1

こんにちは誰もNHibernate ISessionを直接使用する私のサービス層をテストする方法のアドバイスを私に与えることができますか?NHibernateを直接使用するサービス層をテストするには?

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の上にリポジトリ/ DAOのような抽象概念を持たせたくありません。

答えて

2

NHを使用していることにかかわらず、実際にサービスレイヤーでテストする内容を決定する必要があります。

この例では、サービスメソッドに渡した電子メールとパスワードが実際にセッションのチェックとして使用されていることをテストするのがよいでしょう。

この場合、セッション変数をスタブして、あらかじめ決められたメールとパスワードが必要な種類の模擬フレームワーク(Rhino Mockなど)を使用して期待値を設定してから、期待値を返すだけです結果。

このためのいくつかの擬似コードは次のようになります。

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

    stubbedSession 
     .Expect(x => x.Query<UserInfo>()) 
     .Return(new List { 
      new UserInfo { Email = "[email protected]", Password = "whatever" } }); 

    var service = new UserAccountService(stubbedSession); 

    //act 
    var result = service.ValidateUser("[email protected]", "whatever"); 

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

私はあなたはそれが困難な静的な方法でデータベースの相互作用をテストするために見つけることだと思います。テストのために十分な機能があると判断した場合は、テスト目的のために嘲笑できる別のレイヤ(言及した複雑さを追加するレイヤ)に責任を委任することをお勧めします。

関連する問題