我正在尝试使用MVP Passive View实现单元测试我的WinForms应用程序。我创建了模拟视图和模拟模型,以便我可以使用我设置的一些数据测试我的演示者。但是,我遇到了一个问题。
在我的Presenter的构造函数中,我创建了我的模型。我已经考虑通过实现工厂模式来创建我的模型来消除这种做法,而不需要Presenter了解模型的具体实现。
在我的单元测试中,我正在尝试使用其模型测试我的Presenter(InitializeAssessments)中的方法。我希望Presenter在那里使用模拟模型,以便不需要连接到所需的数据库,并且Presenter只获取我在Mocked模型中设置的数据。但是,由于演示者创建了真实的'模型,数据不同,我的测试失败。
您认为我应该实施工厂模式还是有一种简单的方法来解决我自己的问题?工厂模式会解决我的问题吗?
编辑:目前我在考虑使用homeScreenPresenter = new HomeScreenPresenter(this, new HomeScreenModel());
在视图中构建Presenter时创建模型。因此,我只需要在Presenter中引用IModel,使其更容易测试。
Presenter构造函数
public HomeScreenPresenter(IHomeScreenView view)
{
_model = new AssessmentsModel();
_view = view;
_view.InitializingAssessments += InitializeAssessments;
_view.CreatingNewAssessment += CreateNewAssessment;
_view.AddingNewStandard += AddNewStandard;
_view.OpeningAssessment += OpenAssessment;
}
识别TestClass
[TestClass()]
public class HomeScreenPresenterTests
{
MockHomeScreenView view;
MockAssessmentsModel model;
HomeScreenPresenter presenter;
[TestInitialize()]
public void TestInitialize()
{
view = new MockHomeScreenView();
model = new MockAssessmentsModel();
presenter = new HomeScreenPresenter(view);
}
[TestMethod()]
public void HomeScreenPresenterTest()
{
Assert.AreEqual(typeof(MockHomeScreenView), view.GetType());
Assert.AreEqual(typeof(MockAssessmentsModel), model.GetType());
Assert.AreEqual(typeof(HomeScreenPresenter), presenter.GetType());
}
[TestMethod()]
public void InitializeAssessmentsTest()
{
model.TestList = new List<string>
{
"assessment1",
"assessment1",
"assessment2"
};
var expectedList = new List<string>
{
"assessment1",
"assessment2"
};
presenter.InitializeAssessments(this, EventArgs.Empty);
Assert.AreEqual(expectedList, view.ExistingAssessments);
}