2017-06-02 75 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