使用Moq和MVP-VM进行单元测试
本文关键字:单元测试 MVP-VM Moq 使用 | 更新日期: 2023-09-27 18:20:12
我正试图使用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内部,我想从数据库中检索一些属性,并将其存储在MyProperty中。然后,我想测试这个MyProperty是否为Not Null。如果测试顺利无异常,那么拥有MyProperty的演示者应该持有一些值。
我的问题是,我是否适合创建继承RealPresenter(类)的MockPresenter(而不是接口)来执行模拟测试?由于我在RealPresenter中的代码没有提供任何getter或setter来检索此属性,为了不影响我的RealPresenter,我决定继承RealPresenter by MockPresenter类。我还没有在网上看到任何使我的方法可行的示例代码。
第一个问题是您是否只测试测试方法中的一件事。在您的案例中,我认为您在一个方法中测试两件事:在验证返回true时引发事件,在处理事件时检索数据。我建议你把它们分成两种测试方法。
第二个问题是使用Mock而不进行验证,这意味着测试方法中的所有Mock都是stub。我想在你的方法中,至少你会验证一个。
第三个问题是,我没有得到你真正的逻辑是什么,因为你在模拟接口和测试方法中添加了一些额外的逻辑。
我认为在使用MVVM对WPF进行单元测试时,您可能不必测试引发事件处理程序,因为这是.Net框架的工作。您需要测试的是事件处理程序是否正常工作。如果通过命令绑定,您可以模拟命令以测试调用,如果命令的实现包含依赖关系(如数据库连接)。