2017-06-02 10 views
0

ImpositionCalculatorManagerというクラスのメソッドを使用するユニットテストがあります。このクラスでは依存関係注入を使用するので、ImpositionCalculatorRepositoryという別のクラスのメソッドにアクセスできます。私のユニットテストでコンストラクタの引数はインターフェイスのモックに渡すことはできません - MOQ

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に渡す:

ImpositionCalculatorManagerは次のようになります。

しかし、エラー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

ok私はあなたの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

ああ、わかりました。パラメータのカウントミスマッチの問題はリポジトリとまったく関係がありませんでした。それは私が 'ComboBoxItem []'を受け入れるために私の 'ReturnInkDataSource'を嘲笑し、私は1つを渡さなかったということでした。コミットしていただきありがとうございます。私は助けに感謝します – Andrew

0

具体的なImpositionCalculatorPresenterの実装をテストしようとしているとしますか?私はまた、このImpositionCalculatorPresenterの実装がFormOnLoadイベントに応答すると予想されると仮定しています。

私の仮定が正しいならば、あなたの_mockImpositionCalculatorManager.Setup(r => r.ReturnInkDataSource()).Returns<ComboBoxItem[]> (...))は十分なものでなければならないとバッキングを必要としないIImpositionCalculatorRepositoryモックまたはIMPLか何か - 「私はマネージャーを模擬したい」のあなたの目標は、このMOQによって処理されるようですセットアップは、ImpositionCalculatorPresenterが必要なマネージャの勇気を偽造する。

+0

私は具体的な 'ImpositionCalculatorPresenter'をテストしようとしています。そして、プレゼンターが' FormOnLoad'イベントに応答します。私の実装は正しいと思っていたでしょう。マネージャメソッドは、リポジトリを呼び出してデータを返そうとします。 – Andrew

+0

マネージャメソッド 'ReturnInkDataSource()'が正しく嘲笑されているように見えます。リポジトリに関わる必要は全くありません。 – 0xb304

+0

ごめんなさい。 私はマネージャのモックを '_mockImpositionCalculatorManager = new Mock ();'だけに変更すると、コンパイルされると思います。この変更を行うと、どのようなエラーが発生しますか? – 0xb304

関連する問題