2014-09-05 27 views
0

如何使用moq從模擬存儲庫檢索模擬對象?從Moq或任何其他模擬工廠的模擬存儲庫中檢索模擬

我有一個應用程序(mvc2),它沒有真正從第一次支持測試單元設計,但我試圖去適應它。 我有一個服務定位器,可以創建所需的類型。

基本上我想用一個模擬框架做的事情是用模擬對象代替代表服務的變量,然後我想檢索那些模擬對象並設置它們。

所以:

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

在我的測試單位我設置的ServiceLocator使用一個模擬的內核,將嘲笑我的IScopeofService能正常工作。模擬內核使用模擬存儲庫作爲參數 MockRepository Moq發送,它將綁定併爲所需的接口創建所需的模擬。

現在我想在我的測試中檢索該模擬以設置一個假值,以便返回GetPrograms()但我的MockRepository沒有獲取模擬方法來創建新的模擬。

他仍然以某種方式保留所有對mock的引用,因爲它具有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

我很難理解你有什麼問題。在您的測試中發佈代碼,試圖設置服務定位器,並嘗試澄清您的問題。 – 2014-09-05 12:28:48

+0

嗨thx回答我發佈了關於我的代碼的更新。 – 2014-09-08 13:24:08

+0

看起來更像是一個依賴注入問題,而不是一個模擬框架問題給我。在DI中,首先需要在容器中「註冊」依賴項,然後讓框架在運行時「解析」它。在您提供的源代碼中,我看不到IScopeofService被註冊和解決。 – Amol 2014-09-09 04:35:55

回答

0

使用Moq.Get()從一個具體的參考獲取模擬對象。代碼:

[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 */); 
}