3

Мое приложение использует Rhino.Commons - NHRepository и UnitOfWork. Мне нравится синтаксис With.Transaction() для транзакций и используется в течение некоторого времени.Как вы издеваетесь над UnitOfWork от Rhino.Commons?

Но у меня возникла проблема - как я издеваюсь над UnitOfWork для тестирования? Особенно это вызывает проблемы для меня:

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

я могу издеваться репозиториев с Rhino.Mocks, но как я могу легко издеваться UnitOfWork для такого кода?

ответ

0

Спасибо, но я на самом деле решил игнорировать насмешку инфраструктуры Rhino. Я нашел это сообщение от Ayende http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx по использованию базы данных sqlite, перестроенной с каждым тестом. Это было отличное решение!

3

With.Transaction использует свойство UnitOfWork.Current. UnitOfWork - это статический класс - вы не можете издеваться над ним с RhinoMocks.

UnitOfWork.Current - это общедоступное статическое свойство, поэтому вы можете его заменить. К сожалению, сеттер является внутренним.

Я вижу 3 варианта для вас:

  • Изменить источник Rhino.Commons сделать UnitOfWork.Current сеттер общественности, и установить его в тестовом модуле.

  • Используйте отражение, чтобы установить UnitOfWork.Current на ваш поддельный блок работы.

  • Поскольку UnitOfWork.Current внутренне использует Local.Data найти текущую сделки, вы должны быть в состоянии хода:

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

Один бит хорошей новостью является то, что UnitOfWork.Current является IUnitOfWork и RhinoMocks могут легко поддельные интерфейсы.

Я должен закончить, сказав, что я не очень хорошо знаком с Rhino.Commons, поэтому Айенде, возможно, создал правильный способ подделывания UnitOfWork. Если это очень важно для вас, вы должны спросить в дискуссионных группах Rhino.

3

У меня была аналогичная потребность, потому что я хотел проверить логику вокруг настойчивость, фактически не проверяя постоянство данных. Я нашел, что я мог издеваться/окурок в UnitOfWork легко, используя эти 2 строки в SetUp часть моих тестов:

IUnitOfWork theStubUnitOfWork = MockRepository.GenerateStub<IUnitOfWork>(); 
UnitOfWork.RegisterGlobalUnitOfWork(theStubUnitOfWork); 
0

Просто дополнительный бит информации для других: Ogre Psalm33 затронуло как окурок в UnitOfWork, но если вы также хотите With.Transaction работать, вы можете дополнительно окурок в RhinoTransaction:

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); 

вспоминаю видеть записку от Ayende где-то, что он обычно используется With.Transaction в крайнем случае только, когда он не мог использовать его предпочтительный Castle Automatic Transaction Management.