3

내 응용 프로그램에서 Rhino.Commons - NHRepository 및 UnitOfWork를 사용하고 있습니다. 나는 트랜잭션을위한 With.Transaction() 문법을 좋아하고 얼마 동안 그것을 사용 해왔다.어떻게 UnitOfWork를 Rhino에서 모의합니까?

하지만 문제가 발생했습니다. 어떻게 UnitOfWork를 테스트 해보십시오. 특히이 나를 위해 문제를 일으키는 :

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

내가 Rhino.Mocks와 저장소를 조롱 할 수 있지만, 어떻게 쉽게 코드의 이런 종류의 UnitOfWork을 조롱 할 수 있습니까?

답변

0

감사합니다. 실제로 Rhino 인프라 스트럭처의 조롱을 무시하기로했습니다. 모든 테스트와 함께 재 작성된 sqlite 데이터베이스 사용에 관해서는 Ayende http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx에 의해이 게시물을 발견했습니다. 이것은 훌륭한 해결책이었습니다!

3

With.Transaction은 UnitOfWork.Current 속성을 사용합니다. UnitOfWork는 정적 클래스이므로 RhinoMock으로 모의 할 수 없습니다.

UnitOfWork.Current는 공용 정적 속성이므로 스왑 할 수 있습니다. 불행히도 setter는 내부적입니다.

  • 이 UnitOfWork.Current 세터 을 공개하는 Rhino.Commons 소스를 수정하고 단위 테스트에서 설정 :

    나는 당신을 위해 3 가지 옵션을 참조하십시오.

  • 리플렉션을 사용하여 UnitOfWork.Current를 가짜 유닛 에 설정하십시오. UnitOfWork.Current는 내부적으로 현재 거래를 찾을 Local.Data을 사용하기 때문에

  • , 당신은 갈 수 있어야한다 :

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

좋은 소식은 UnitOfWork.Current가 IUnitOfWork이고 RhinoMocks가 인터페이스를 쉽게 위장 할 수 있다는 것입니다.

나는 Rhino에 익숙하지 않다는 말로 끝내야합니다. 대다수인데, Ayende가 UnitOfWork를 위조하는 올바른 방법을 만들었을 수도 있습니다. 이것이 당신에게 매우 중요하다면, Rhino 토론 그룹에서 물어보아야합니다.

3

주위에 주변의 로직을 테스트하고 싶었 기 때문에 데이터의 지속성을 실제로 테스트하지 않아도 비슷한 요구가있었습니다. 나는/내가 조롱 수 발견 쉽게 내 시험의 설정 부분이 2 줄을 사용하여 UnitOfWork 스텁 : 다른 사람에 대한 정보의

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

그냥 추가 비트 : 오우거 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을 사용 어딘가에 있다는 Ayende에서 메모를보고 리콜 그의 선호 Castle Automatic Transaction Management.