Unit testing 你们如何模仿Rhino.Commons的工作单元?

Unit testing 你们如何模仿Rhino.Commons的工作单元?,unit-testing,nhibernate,rhino-mocks,repository,rhino-commons,Unit Testing,Nhibernate,Rhino Mocks,Repository,Rhino Commons,我的应用程序使用Rhino.Commons-NHRepository和UnitOfWork。我喜欢用于事务的With.Transaction()语法,并且已经使用了一段时间 但我遇到了一个问题——如何模拟用于测试的工作单元?尤其是这给我带来了麻烦: With.Transaction(() => Repositories.TwinfieldSpooler.Update(spool)); 我可以用Rhino.Mocks模拟存储库,但如何轻松地模拟此类代码的UnitOfWork?with.Tr

我的应用程序使用Rhino.Commons-NHRepository和UnitOfWork。我喜欢用于事务的With.Transaction()语法,并且已经使用了一段时间

但我遇到了一个问题——如何模拟用于测试的工作单元?尤其是这给我带来了麻烦:

With.Transaction(() => Repositories.TwinfieldSpooler.Update(spool));

我可以用Rhino.Mocks模拟存储库,但如何轻松地模拟此类代码的UnitOfWork?

with.Transaction使用UnitOfWork.Current属性。UnitOfWork是一个静态类——不能使用Rhinomock对其进行模拟

当前是一个公共静态属性,所以您可以将其替换掉。不幸的是,setter是内部的

我为您提供了3种选择:

  • 修改Rhino.Commons源以使UnitOfWork.Current setter成为当前setter 公共,并在单元测试中设置它

  • 使用反射将UnitOfWork.Current设置为伪单位 一份工作

  • 因为UnitOfWork.Current在内部使用Local.Data来查找当前 交易,你应该能够 去:

    Rhino.Commons.Local.Data[UnitOfWork.CurrentUnitOfWorkKey]=myFakeUnitOfWork

一个好消息是UnitOfWork.Current是一个IUnitOfWork,Rhinomock很容易伪造接口


最后,我必须说,我对Rhino.Commons不太熟悉,所以Ayende可能已经建立了一种假装工作单元的正确方法。如果这对你来说非常重要,你应该在Rhino讨论小组中提问。

谢谢,但我实际上决定忽略对Rhino基础设施的嘲笑。
我在Ayende关于使用每次测试都重建的sqlite数据库的文章中找到了这篇文章。这是一个很好的解决方案

我也有类似的需求,因为我想测试关于持久性的逻辑,而不是实际测试数据的持久性。我发现我可以在测试的设置部分使用以下两行代码轻松地模拟/存根
UnitOfWork

IUnitOfWork theStubUnitOfWork = MockRepository.GenerateStub<IUnitOfWork>();
UnitOfWork.RegisterGlobalUnitOfWork(theStubUnitOfWork);
IUnitOfWork theStubUnitOfWork=MockRepository.GenerateStub();
工作单元。注册全局工作单元(工作单元);

仅为其他人提供一点额外信息:食人魔诗篇33提到了如何存根UnitOfWork,但如果您也希望.Transaction起作用,您可以另外存根一个事务:

IUnitOfWork stubUnitOfWork = MockRepository.GenerateStub<IUnitOfWork>();
RhinoTransaction stubTx = MockRepository.GenerateStub<RhinoTransaction>();
stubUnitOfWork.Expect(x => x.BeginTransaction(System.Data.IsolationLevel.Unspecified)).IgnoreArguments().Return(stubTx);
UnitOfWork.RegisterGlobalUnitOfWork(stubUnitOfWork);
IUnitOfWork stubUnitOfWork=MockRepository.GenerateStub();
RhinoTransaction stubTx=MockRepository.GenerateStub();
Expect(x=>x.BeginTransaction(System.Data.IsolationLevel.Unspecified)).IgnoreArguments().Return(stubTx);
UnitOfWork.RegisterGlobalUnitOfWork(stubUnitOfWork);
我记得在某处看到Ayende的一张便条,他通常在最后一种情况下使用.Transaction,当他无法使用首选的时