我想使用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;
}
提前感谢任何建议!
答案 0 :(得分: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,但我不是百分之百确定。)