2011-06-21 5 views
2

FakeItEasyを使用して偽のnHibernateセッションを自分のリポジトリに挿入し、テスト内で事前に定義されたオブジェクトのリストを返したいとします。誰もこれをやる経験がありますか?ここでFakeItEasyとのnHibernateセッションのフェイク

は、例のテストです。何かアドバイスを事前に

public IEnumerable<Tank> GetTanks() 
{ 
    var tanks = Session.CreateCriteria(typeof(Tank)).List<Tank>(); 
    return tanks; 
} 

ありがとう:

[TestFixture] 
public class ProductionRepositoryTester 
{ 
private ProductionRepository _productionRepository; 

[SetUp] 
public void SetupFixture() 
{ 
    const string propertyNumber = "123"; 
    Tank tank = new Tank { PropertyNumber = propertyNumber }; 

    var session = A.Fake<ISession>(); 
    var sessionFactory = A.Fake<ISessionFactory>(); 

    A.CallTo(session).WithReturnType<IList<Tank>>().Returns(new List<Tank> { tank }); 

    _productionRepository = new ProductionRepository(session, sessionFactory); 
} 

[Test] 
public void ProductionRepositoryCanGetTanks() 
{ 
    var tanks = _productionRepository.GetTanks(); 

    Assert.AreNotEqual(0, tanks.Count(), "Tanks should have been returned."); 

} 
} 

そしてここでは、実際のP​​roductionRepositoryクラス内の呼び出しです!

答えて

7

まず、私はNHibernateインターフェースを全く偽造することに対してアドバイスをしますが、これは(私の意見では)ユニットテストのレベルが低すぎます。おそらく、これらのシナリオについていくつかの統合テストを行う方が良いでしょう。言い換えれば、ユニットはProductionRepository(IProductionRepository)の抽象とのすべての相互作用をテストしますが、そこでは停止します。しかし、これは私の意見です。実際にこれを行うには、偽セットアップを変更する必要があると思います。

セッションは、IListではなく、基準を返します。したがって、あなたはあまりにも偽の基準を持っている必要があるだろう:

var fakeCriteria = A.Fake<ICriteria>(); 

A.CallTo(fakeCriteria).WithReturnType<IList<Tank>>().Returns(new List<Tank> { tank }); 

A.CallTo(session).WithReturnType<ICriteria>().Returns(fakeCriteria); 

を(私は基準が正しく入力覚えて願って、私はそれがICriteriaだと思うが、私は百パーセントわからない。)

+0

素晴らしく見えること!私はまもなくそれを試してみますが、nHibernate LINQプロバイダを使用していて、単にsession.Queryを呼び出す状況には疑問があります。().ToList(); 。この場合、拡張メソッドのためにFakeItEasyが失敗します。 – jdscolam

関連する問題