J'ai donc un test unitaire qui utilise une méthode dans une classe appelée ImpositionCalculatorManager
. Dans cette classe, j'utilise l'injection de dépendance pour pouvoir accéder aux méthodes d'une autre classe appelée ImpositionCalculatorRepository
.Les arguments constructeurs ne peuvent pas être transmis pour les fausses interfaces - MOQ
Le ImpositionCalculatorManager
ressemble à ceci:
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();
}
}
}
Dans mon test unitaire je me moque du ImpositionCalculatorManager
et passer dans une version moqué ImpositionCalculatorRepository
dans le constructeur de la classe de gestionnaire.
Cependant, j'obtiens l'erreur Constructor arguments cannot be passed for interface mocks
.
C'est ce qui ressemble à mon appareil de test unitaire:
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);
}
}
}
Je l'ai regardé sur le débordement de la pile et les gens disent que c'est parce qu'une interface ne dispose pas d'un constructeur et que la classe ne et que Je ne devrais pas avoir à passer quelque chose dans le constructeur, mais quand je supprime les arguments constructeurs de la maquette, je reçois l'erreur Parameter count mismatch
en essayant de configurer une méthode à partir du gestionnaire.
Je voudrais juste me moquer du gestionnaire afin que je puisse configurer une méthode pour retourner les valeurs que j'ai déjà définies.
Pourquoi cela ne fonctionne-t-il pas?
On dirait que vous manquez déclaration Mock ici 'readonly privé Mock < IImpositionCalculatorPresenter> _impositionCalculatorPresenter; ' – Ripon
Mon présentateur n'est pas une interface et je devrais rendre toutes mes méthodes virtuelles et je ne veux pas faire cela. Est-ce que cela ferait une différence de toute façon? – Andrew