2011-06-21 48 views
2

我想使用FakeItEasy将伪造的nHibernate会话注入到我的资源库中,然后返回在我的测试中预定义的对象列表。有没有人有这样的经验?用FakeItEasy伪造一个nHibernate会话

下面是试验例:

[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."); 

} 
} 

这里是实际ProductionRepository类中调用:

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

预先感谢任何建议!

回答

7

首先,我会建议不要伪造NHibernate接口,这是(在我看来)对于单元测试来说太低级别。对这些场景进行一些集成测试可能会更好。换句话说,单元测试与ProductionRepository(IProductionRepository)的抽象的所有交互,但在那里停止。然而,现在,这只是我的意见,如果你真的想这样做,我认为你将不得不改变你的假设置:

会话返回一个标准,而不是直接的IList。因此,你得有一个假的标准太:(我希望我能记得的标准类型正确,我认为这是的ICriteria,但我不是一个百分之百的把握)

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

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

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

+0

看起来不错!我会尽快尝试,但是我想知道使用nHibernate LINQ提供程序的情况,只是调用session.Query ().ToList(); 。在这种情况下,FakeItEasy将因为扩展方法而失败。 – jdscolam