繁体   English   中英

使用Moq和MVP-VM进行单元测试

[英]Unit Testing using Moq and MVP-VM

我正在尝试使用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框架)

    [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是否不为空。 如果测试顺利进行,没有异常,则具有MyProperty的演示者应保留一些值。

我的问题是,我是否应该创建继承RealPresenter(class)的MockPresenter(非接口)以执行模拟测试? 由于我在RealPresenter中的代码不提供任何获取方法或设置方法来检索此Property,因此我决定通过MockPresenter类继承RealPresenter,以免影响我的RealPresenter。 我没有在网上看到任何使我的方法可行的示例代码。

第一个问题是您是否仅在测试方法中进行测试。 就您而言,我认为您正在用一种方法测试两件事:在验证返回true时引发事件,以及在处理事件时检索数据。 我建议您将它们分为两种测试方法。

第二个问题是您使用Mock而不进行验证,这意味着测试方法中的所有模拟都是存根。 我想至少您会验证一种方法。

第三个问题是,我没有获得真正的逻辑,因为您在模拟接口和测试方法中添加了一些其他逻辑。

我认为在带有MVVM的WPF的单元测试中,您可能不必测试引发事件处理程序,因为这是.Net框架的工作。 您需要测试的是事件处理程序是否正常工作。 如果通过命令绑定,则可以模拟命令以测试调用,如果命令的实现包含诸如数据库连接之类的依赖关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM