是否有可能将依赖于NHibernate Detached Criteria的测试方法单元化?

Aim*_*Kai 1 c# nhibernate unit-testing fluent-nhibernate detachedcriteria

我曾尝试使用Moq对使用DetachedCriteria类的存储库上的方法进行单元测试.但是我遇到了一个问题,即我实际上无法模拟内部构建的内部Criteria对象.有没有办法模拟分离标准?

测试方法

        [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);
        }
Run Code Online (Sandbox Code Playgroud)

存储库类

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>();
    }
Run Code Online (Sandbox Code Playgroud)

}

注意我也在这里使用"NHibernate.LambdaExtensions"和"Castle.Facilities.NHibernateIntegration".任何帮助将不胜感激.

基本上我在返回的对象的断言上得到一个空引用异常.因此,我假设我没有正确连接标准.但我认为我不能这样做,因为标准是在我的存储库中创建的Detached Criteria的私有字段!

Sha*_*lle 5

老实说,我很久以前就试图对触及数据库的任何东西进行单元测试.

在内存中调用Sqlite数据库并运行实际测试要容易得多.或者,如果您希望针对真实数据库运行它们,那么只需将它们移动到集成测试中,这些集成测试仅在您签入源代码控制时才会运行.