0

我正在尝试使用 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。我没有在网上看到任何使我的方法可行的示例代码。

4

1 回答 1

0

第一个问题是你是否只在你的测试方法中测试一个东西。就您而言,我认为您正在用一种方法测试两件事:在验证返回 true 时引发事件,并在处理事件时检索数据。我建议你把它们分成两种测试方法。

第二个问题是您在没有验证的情况下使用 Mock,这意味着您的测试方法中的所有模拟都是存根。我想在你的方法中至少你会验证一个。

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

我认为在使用 MVVM 对 WPF 进行单元测试时,您可能不必测试引发事件处理程序,因为这是 .Net 框架的工作。您需要测试的是事件处理程序是否正常工作。如果它通过命令绑定,您可以模拟命令以测试调用如果命令的实现包含依赖项,例如数据库连接。

于 2013-06-28T13:39:22.683 回答