2014-09-05 3 views
0

moq를 사용하여 모의 저장소에서 모의 ​​객체를 검색하려면 어떻게해야합니까?모의 저장소 또는 다른 모의 공장과 모의 저장소에서 모의 ​​검색

테스트 유닛을 처음 지원할 때 실제로 설계되지 않은 응용 프로그램 (mvc2)이 있지만이를 적용하려고합니다. 원하는 유형을 만드는 서비스 로케이터가 있습니다.

기본적으로 mock 프레임 워크를 사용하여 수행하려는 작업은 메소드의 서비스를 나타내는 변수를 mock 객체로 대체 한 다음 해당 mock 객체를 검색하여 설정하려고합니다.

그래서 내 테스트 유닛에서

private ApprovalLevel GetApprovalLevel(Fusion Fusion) 
{ 
    var ScopeofService=ServiceLocator.GetInstance<IScopeofService>(); 
    var programs=ScopeofService.GetPrograms(); 
    ...  
} 

나는이 작품을 잘 내 IScopeofService을 조롱하는 모의 커널을 사용하도록 ServiceLocator를 설정합니다. 모의 커널은 모의 저장소를 매개 변수 MockRepository Moq으로 보내어 원하는 인터페이스에 원하는 모의 객체를 바인딩하고 생성합니다.

GetPrograms()에 대한 가짜 값을 설정하기 위해 테스트에서 모의 ​​객체를 가져 오려고했지만 MockRepository에는 새로운 모의 객체를 만드는 메소드가 없습니다.

그래도 그는 VerifyAll 메소드가 있기 때문에 모의에 대한 모든 참조를 유지합니다.

업데이트

public MockNinjectControllerFactory(Moq.MockRepository mockRepository) 
{ 
    Kernel = new StandardKernel(new MockNinjectServices(mockRepository)); 
} 

public class MockNinjectServices : NinjectModule 
{ 
    private readonly MockRepository _mockRepository; 
    public MockNinjectServices(MockRepository _mockRepository) 
    { 
     this._mockRepository = _mockRepository; 
    } 

    // TODO MARIAN: Resolver should return actualy mock objects also to be able to set them. 
    public void BindToConstant<T>() where T : class 
    { 
     Bind<T>().ToConstant(_mockRepository.Create<T>().Object).InSingletonScope(); 
    } 

    public void BindMock<T>() where T : class 
    { 
     Bind<Mock<T>>().To(typeof(Mock<T>)).InSingletonScope(); 
    } 

    public override void Load() 
    { 
     BindToConstant<IPaymentInvoiceRep>(); 
     BindToConstant<IPaymentInvoiceBL>(); 
    } 
} 

그리고 시험 자체 :

[TestFixture] 
public class DemoControllerFixture 
{ 
    readonly MockRepository _mockRepository = new MockRepository(MockBehavior.Default); 

    [Test] 
    public void Should_MyMethod() 
    {   
     EvedServiceLocator.Default = new MockNinjectControllerFactory(_mockRepository); 
     var sut=new DemoController(); 

     // now if my sut has something that will resolve as mock created by my mockRepository I would like to retrieve that mock and set up something on it.    
    } 
} 
+0

나는 당신이 가지고있는 문제를 이해하는 데 어려움을 겪고 있습니다. 테스트에서 서비스 위치 지정자를 설정하려는 코드를 게시하고 문제를 조금 명확히하십시오. –

+0

안녕하세요 답변을위한 thx 내 코드에 관한 업데이트를 게시했습니다. –

+0

의존성 주입 문제와 비슷하게 보이지만 조롱하는 프레임 워크 문제는 아닙니다. DI에서는 먼저 컨테이너에 종속성을 "등록"하고 프레임 워크가 런타임에이를 "해결"하도록해야합니다. 귀하가 제공 한 소스 코드에서 IScopeofService가 등록되고 해결되는 것을 볼 수 없습니다. – Amol

답변

0

사용 Moq.Get() 콘크리트 참조에서 mock 객체를 얻을 수 있습니다. 코드에서 :

[Test] 
public void Should_MyMethod() 
{   
    EventServiceLocator.Default = new MockNinjectControllerFactory(_mockRepository); 
    var sut=new DemoController(); 

    var scopeService EventServiceLocator.Default.GetInstance<IScopeofService>(); 
    var mockScopeService = Mock.Get(scopeService); 
    mockScopeService.Setup(p => p.GetPrograms()).Returns(/* TODO */); 
}