Я попытался использовать Moq для тестирования метода в репозитории, который использует класс DetachedCriteria. Но я сталкиваюсь с проблемой, из-за которой я не могу фактически издеваться над внутренним объектом Criteria, который встроен внутри. Есть ли способ издеваться над отдельными критериями?Можно ли использовать единые методы тестирования, которые зависят от отдельных критериев NHibernate?
Метод испытания
[Test]
[Category("UnitTest")]
public void FindByNameSuccessTest()
{
//Mock hibernate here
var sessionMock = new Mock<ISession>();
var sessionManager = new Mock<ISessionManager>();
var queryMock = new Mock<IQuery>();
var criteria = new Mock<ICriteria>();
var sessionIMock = new Mock<NHibernate.Engine.ISessionImplementor>();
var expectedRestriction = new Restriction {Id = 1, Name="Test"};
//Set up expected returns
sessionManager.Setup(m => m.OpenSession()).Returns(sessionMock.Object);
sessionMock.Setup(x => x.GetSessionImplementation()).Returns(sessionIMock.Object);
queryMock.Setup(x => x.UniqueResult<SopRestriction>()).Returns(expectedRestriction);
criteria.Setup(x => x.UniqueResult()).Returns(expectedRestriction);
//Build repository
var rep = new TestRepository(sessionManager.Object);
//Call repostitory here to get list
var returnR = rep.FindByName("Test");
Assert.That(returnR.Id == expectedRestriction.Id);
}
Repository Класс
public class TestRepository
{
protected readonly ISessionManager SessionManager;
public virtual ISession Session
{
get { return SessionManager.OpenSession(); }
}
public TestRepository(ISessionManager sessionManager)
{
}
public SopRestriction FindByName(string name)
{
var criteria = DetachedCriteria.For<Restriction>().Add<Restriction>(x => x.Name == name)
return criteria.GetExecutableCriteria(Session).UniqueResult<T>();
}
}
Примечание Я использую "NHibernate.LambdaExtensions" и "Castle.Facilities.NHibernateIntegration" здесь, как Что ж. Любая помощь будет с благодарностью оценена.
По сути, я получаю исключение с ссылкой на null для утверждения возвращаемого объекта. Таким образом, я предполагаю, что я не правильно подключил критерии. Но я не думаю, что могу это сделать, потому что критерии - это частное поле Частных критериев, которое создается внутри моего репозитория!
Я не говорю о касании базы данных. Я тестирую классы репозитория. Убедившись, что они действительно получают доступ к правильным методам. Я сопоставляю тесты отдельно с Sqlite. Я думаю, вы неправильно поняли мой вопрос. Я издевался над nhibernate, не тестируя фактическую базу данных. –
Я согласен с тем, что вы говорите, но это не ответ на вопрос. –
Но зачем издеваться над NHibernate? Почему бы просто не попасть в реальную базу данных?Вы должны быть осторожны в том, чтобы слишком сосредоточиться на том, как что-то делается, что приводит к запахам над тестирующими характеристиками. Что вы должны волноваться, так это получить ожидаемые результаты, когда я использую свой репозиторий. –