Подделка сеанса nHibernate с помощью FakeItEasy - PullRequest
2 голосов
/ 22 июня 2011

Я хотел бы добавить поддельный сеанс 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 Ответ

7 голосов
/ 22 июня 2011

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

...