Подделка сеанса nHibernate с помощью FakeItEasy

Я хотел бы добавить поддельный сеанс nHibernate в мой репозиторий с помощью FakeItEasy, а затем вернуть список объектов, которые предварительно определены в моем тесте. У кого-нибудь есть опыт в этом?

Вот пример теста:

[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;
}

Спасибо заранее за любые советы!

1 ответ

Решение

Прежде всего, я бы советовал не подделывать интерфейсы 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, но я не уверен на сто процентов.)

Другие вопросы по тегам