我正在尝试使用 MVP-VM 模式在我的代码中执行单元测试(使用 Moq 的集成测试)。我有一个视图、一个视图模型和一个演示者。
演示者拥有我的 UI 的实际功能。
我试图测试我的演示者的方式是,如下所示。
public interface IMockView : IRealView
{
event EventHandler ButtonClickedEvent;
}
public interface IMockViewModel : IRealViewModel
{ }
public class MockPresenter : RealPresenter
{
private IMockView _view;
private IMockViewModel _viewModel;
public MyProperty { get; set; }
public MockPresenter (IMockView view, IMockViewModel viewModel)
:base(view, viewModel)
{
_view = view;
_viewModel = viewModel;
view.ButtonClickedEvent += (s, e) =>
{
//Do Something
this.MyProperty = Property retrieved from db.
};
}
}
这是我的测试代码。(我正在使用带有 Moq 的 NUnit 测试框架)
[Test]
public void TriggerCreateClicked()
{
var view = new Mock<IMockView>();
var viewModel = new Mock<IMockViewModel>();
var presenter = new MockPresenter(view.Object, viewModel.Object);
viewModel.Setup(x => x.IsValid).Returns(true)
.Raises(t => t.ButtonClickedEvent += null, EventArgs.Empty);
viewModel.Object.IsValid = true;
Assert.NotNull(presenter.MyProperty);
}
基本上,在我的测试用例中,
如果 ViewModel.IsValid 返回 true,我将引发 ButtonClickedEvent。然后,在 Presenter 内部,我想从 db 中检索一些属性并将其存储在 MyProperty 中。然后,我想测试这个 MyProperty 是否为 Not Null。如果测试无一例外地顺利通过,则具有 MyProperty 的演示者应该持有一些值。
我的问题是,我是否适合创建继承 RealPresenter(class) 的 MockPresenter(not interface) 以执行 Mock Test?由于我在 RealPresenter 中的代码没有提供任何 getter 或 setter 来检索此属性,因此我决定通过 MockPresenter 类继承 RealPresenter,以免影响我的 RealPresenter。我没有在网上看到任何使我的方法可行的示例代码。