我是新来的NHibernate,甚至更新的版本来MOQ(或其他类似的框架)。在日夜搜索(谷歌+ stackoverflow +其他)后,我正在寻求帮助。起订量NHibernate的ISession.Get不叫模仿会话对象
的情况是(应该是)简单。我想单元测试一个使用NHibernate作为ORM层的C#WCF服务的调用。该方法在完成一些初始工作后,找到要连接的数据库,然后调用SessionProvider(会话工厂的管理器)为分片数据库返回nhibernate会话。然后我尝试使用ISession.Get <>()从数据库中检索一个对象,然后做一些工作。问题在于GUID(我在db中查找的条目的关键)是在调用开始时生成的,我无法知道它可能在WCF调用的范围之外。因此,我不能使用sqllite或其他技术来预先填充必要的数据来控制测试。我所希望的是,我可以以某种方式模拟(注入一个虚假的层?)对Session.Get的调用,以返回一个无效的对象,这将导致WCF调用抛出。
这里的测试代码片段:
var testRequest = ... (request DTO)
var dummyBadObject = ... (entity in DB)
var mock = new Mock<ISession>(MockBehavior.Strict);
mock.Setup(m => m.Get<SampleObject>(It.IsAny<Guid>())).Returns(dummyBadObject);
var exception = Assert.Throws<FaultException>(() => applicationService.SomeMethod(testRequest));
Assert.AreEqual(exception.Code.ToString(), SystemErrorFault.Code.ToString());
当我运行,而不是与模拟的Isession对象交互本次测试,应用服务代码调用实际的Isession对象的获取从会话工厂,可连接到数据库并获得正确的对象。似乎我错过了一些非常基本的关于模拟或注入的东西。任何帮助将不胜感激。
感谢, 肖恩
你已经设置了一个模拟的ISession。但你在SessionProvider中注册的地方在哪里? – 2013-05-11 22:45:05
SessionProvider是应用程序服务程序集的一部分,它在初始化时初始化静态会话提供程序,然后创建会话工厂高速缓存以按需提供会话。因此,我无法直接注册模拟会话,而无需在为我执行内部工作的应用程序服务上创建测试方法。我希望Moq能够为ISession做一个“全局”拦截,然后发出模拟会话。现在,这是我对Moq做什么的理解完全错误的地方。也许微软的假货可能是合适的? – Shawn 2013-05-12 02:33:42