MOQ,无法为接口模拟传递构造函数参数

时间:2017-06-02 22:18:46

标签: c# unit-testing constructor moq

所以我有一个单元测试,它使用一个名为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

我只想模拟经理,这样我就可以设置一个方法来返回我已设置的值。

为什么这不起作用?

2 个答案:

答案 0 :(得分:1)

好的,我转发了您的Parameter count mismatch问题。试试这两个变化:

1)(如前所述)创建你的经理,没有任何构造函数,没有任何其他依赖;和

2)修复给Func模拟的ReturnInkDataSource:改变这个:

    _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()的lambda的参数必须与Setup()中提供的参数相匹配 - 请参阅{{3 }}

答案 1 :(得分:0)

我假设您正在尝试测试具体的ImpositionCalculatorPresenter实施?我还假设此ImpositionCalculatorPresenter实施预计会响应FormOnLoad事件。

如果我的假设是正确的,那么您的_mockImpositionCalculatorManager.Setup(r => r.ReturnInkDataSource()).Returns<ComboBoxItem[]> (...))就足够了,并且不需要支持IImpositionCalculatorRepository模拟或impl或任何东西 - 你的目标是&#34;我只是想嘲笑经理&#34;似乎是由这个moq设置处理的,它会使ImpositionCalculatorPresenter需要的管理者的内心失去作用。