2017-06-02 77 views
0

所以我有一個單元測試,它使用類ImpositionCalculatorManager類中的方法。在這個類中,我使用依賴注入,所以我可以訪問另一個類ImpositionCalculatorRepository上的方法。構造函數的參數不能傳遞接口模擬 - 最小起訂量

ImpositionCalculatorManager看起來是這樣的:

public class ImpositionCalculatorManager : IImpositionCalculatorManager { 
     private readonly IImpositionCalculatorRepository _impositionCalculatorRepository; 
     public ImpositionCalculatorManager(IImpositionCalculatorRepository impositionCalculatorRepository) { 
      _impositionCalculatorRepository = impositionCalculatorRepository; 
     } 
     public ComboBoxItem[] ReturnInkDataSource() { 
      return _impositionCalculatorRepository.ReturnInkDataSource(); 
     } 

     public ComboBoxItem[] ReturnCoatingDataSource() { 
      return _impositionCalculatorRepository.ReturnCoatingDataSource(); 
     } 
    } 
} 

在我的單元測試我嘲笑ImpositionCalculatorManager,並在嘲笑ImpositionCalculatorRepository版本傳入構造爲管理器類。

但是,我收到錯誤Constructor arguments cannot be passed for interface mocks

這是我的單元測試夾具的樣子:

public class ImpositionCalculatorPresenterTestFixture { 
     private ImpositionCalculatorPresenter _impositionCalculatorPresenter; 
     private readonly SystemVariablesPresenter _systemVariablesPresenter; 
     private readonly Mock<IImpositionCalculatorManager> _mockImpositionCalculatorManager; 
     private readonly Mock<ISystemVariablesView> _mockSystemVariablesView; 
     private readonly Mock<IPrintingDesignManager> _mockPrintingDesignManager; 
     private readonly Mock<ISystemVariablesManager> _mockSystemVariablesManager; 
     private readonly Mock<IImpositionCalculatorRepository> _mockImpositionCalculatorRepo; 
     private Mock<IImpositionFormView> _mockView; 

     public ImpositionCalculatorPresenterTestFixture() { 
      _mockImpositionCalculatorRepo = new Mock<IImpositionCalculatorRepository>(); 
//Error occurs on the below line 
      _mockImpositionCalculatorManager = new Mock<IImpositionCalculatorManager>(_mockImpositionCalculatorRepo.Object); 
      _mockSystemVariablesView = new Mock<ISystemVariablesView>(); 
      _mockPrintingDesignManager = new Mock<IPrintingDesignManager>(); 
      _mockSystemVariablesManager = new Mock<ISystemVariablesManager>(); 
      _systemVariablesPresenter = new SystemVariablesPresenter(_mockSystemVariablesView.Object, _mockSystemVariablesManager.Object); 
     } 

[TestMethod] 
     public void PopulateInkDataSources_ApplicationOnLoad_InkDataSourcesPopulatedWithDataFromJSON() { 
      //Arrange 
      SetupImpostionPresenter(); 
      _mockView.SetupProperty(r => r.InkSideOneDataSource); 
      _mockView.SetupProperty(r => r.InkSideTwoDataSource); 
      _mockImpositionCalculatorManager.Setup(r => r.ReturnInkDataSource()) 
       .Returns<ComboBoxItem[]> 
       (x => new ComboBoxItem[] { 
         new ComboBoxItem("Test", 1), 
         new ComboBoxItem("Test 2", 2) 
       }); 

      //Act 
      _mockView.Raise(r => r.FormOnLoad += null, new EventArgs()); 

      //Assert 
      Assert.IsTrue(_mockImpositionCalculatorManager.Object.ReturnInkDataSource() 
       == _mockView.Object.InkSideOneDataSource && _mockImpositionCalculatorManager.Object.ReturnInkDataSource() 
       == _mockView.Object.InkSideTwoDataSource 
       ); 
     } 

private void SetupImpostionPresenter() { 
      _mockView = new Mock<IImpositionFormView>(); 
      _impositionCalculatorPresenter = new ImpositionCalculatorPresenter(_mockView.Object, 
      _mockImpositionCalculatorManager.Object, _mockSystemVariablesManager.Object, _systemVariablesPresenter, 
      _mockPrintingDesignManager.Object); 
     } 
    } 
} 

我看着在堆棧溢出,人們說這是因爲接口不具有構造函數,只有類不和我不應該將任何東西傳遞給構造函數,但是當我從模擬中移除構造函數參數時,在嘗試從管理器設置方法時收到錯誤Parameter count mismatch

我只是想嘲笑經理,所以我可以設置一個方法來返回我已經設置的值。

爲什麼這不起作用?

+0

看起來你在這裏失蹤模擬聲明 '私人只讀模擬< IImpositionCalculatorPresenter> _impositionCalculatorPresenter;' – Ripon

+0

我的演示者不是一個接口,我必須讓所有的方法都是虛擬的,我不想這樣做。這樣做會有所作爲嗎? – Andrew

回答

1

好的我再現了你的Parameter count mismatch問題。嘗試這兩個更改:

1)(如前所述)創建您的管理器沒有任何構造函數和沒有任何其他依賴項;和

2)固定給予ReturnInkDataSource模擬的Func:更改此:

_mockImpositionCalculatorManager.Setup(r => r.ReturnInkDataSource()) 
      .Returns<ComboBoxItem[]> 
      (x => new ComboBoxItem[] { 
        new ComboBoxItem("Test", 1), 
        new ComboBoxItem("Test 2", 2) 
      }); 

_mockImpositionCalculatorManager.Setup(r => r.ReturnInkDataSource()) 
      .Returns(
       () => new ComboBoxItem[] { 
         new ComboBoxItem("Test", 1), 
         new ComboBoxItem("Test 2", 2) 
         } 
      ); 

第一個變化是基本DI /嘲諷 - 我們不需要爲嘲笑嘲笑。

第二個變化是Moq特殊 - 這是必要的,因爲給Returns()爲拉姆達的PARAMS必須Setup()提供的PARAMS匹配 - 看Moq + Unit Testing - System.Reflection.TargetParameterCountException: Parameter count mismatch

+0

啊,我明白了。參數計數不匹配問題根本與存儲庫無關。這是我嘲笑我的'ReturnInkDataSource'接受一個'ComboBoxItem []',我沒有通過。謝謝你保持承諾。我很感激幫助 – Andrew

0

我假設你試圖測試具體ImpositionCalculatorPresenter實現?我還假設此ImpositionCalculatorPresenter實現預計將響應FormOnLoad事件。

如果我的假設是正確的,那麼你的_mockImpositionCalculatorManager.Setup(r => r.ReturnInkDataSource()).Returns<ComboBoxItem[]> (...))應該是足夠的,並且不會要求後盾IImpositionCalculatorRepository模擬或IMPL或任何東西 - 你的「我只想嘲笑經理」的目標似乎是由這起訂量來處理安裝程序,它會欺騙ImpositionCalculatorPresenter需要的管理員的內心。

+0

我想測試具體的'ImpositionCalculatorPresenter',並且是主持人響應'FormOnLoad'事件。我也會認爲我的實施是正確的。管理器方法調用存儲庫以嘗試返回數據。 – Andrew

+0

管理器方法'ReturnInkDataSource()'似乎被正確地模擬,根本不需要涉及庫。 – 0xb304

+0

抱歉意味着更詳細。 我期望當你將管理器模擬更改爲只是'_mockImpositionCalculatorManager = new Mock ();'時,它會編譯。如果你做這個改變,那麼你會得到什麼錯誤? – 0xb304