Как вы издеваетесь над UnitOfWork из Rhino.Commons? - PullRequest
3 голосов
/ 07 апреля 2009

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 12 августа 2009

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

IUnitOfWork theStubUnitOfWork = MockRepository.GenerateStub<IUnitOfWork>();
UnitOfWork.RegisterGlobalUnitOfWork(theStubUnitOfWork);
3 голосов
/ 20 июля 2009

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.

0 голосов
/ 09 августа 2011

Просто дополнительный бит информации для других: 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);

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

0 голосов
/ 03 августа 2009

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

...