【问题标题】:How to mock DragEventArgs如何模拟 DragEventArgs
【发布时间】:2012-09-03 16:00:05
【问题描述】:

我正在尝试对从我的 ViewModel 调用的这个方法进行单元测试:

  public virtual string[] ExtractFilePaths(DragEventArgs dragEventArgs)
  {
     string[] droppedPaths = null;

     if (dragEventArgs.Data.GetDataPresent(DataFormats.FileDrop))
     {
        droppedPaths = dragEventArgs.Data.GetData(DataFormats.FileDrop, true) as string[];
     }

     return droppedPaths;
  }

我已将此方法与 Caliburn 连接起来。我知道这是一个非常简单的方法,几乎​​只使用框架类,但我觉得它仍然需要测试。问题是,起订量不能模拟 DragEventArgs。有没有办法解决这个问题,还是我不应该费心测试这个方法?

【问题讨论】:

    标签: wpf unit-testing mocking moq


    【解决方案1】:

    希望我没有错过任何关于 Calibrun 的东西,但是当你可以创建一个时,为什么要模拟 DragEventArgs 呢?重要的部分是IDataObject部分,它是一个接口,很容易被mock。

    [Test]
    public void ExtractFilePaths_WithFileDrop_ReturndDropPaths()
    {
        var fileList = new[] {@"c:\path\path\file1.txt", @"d:\path2\path2\file2.txt"};
        var stubData = Mock.Of<IDataObject>(x =>
                                            x.GetDataPresent(DataFormats.FileDrop) == true &&
                                            x.GetData(DataFormats.FileDrop, true) == fileList);
    
        var dragEventArgs = new DragEventArgs(stubData, 0, 0, 0, DragDropEffects.Move, DragDropEffects.Scroll);
    
        var subject = new Subject();
    
        // Act
        var result = subject.ExtractFilePaths(dragEventArgs);
    
        // Assert
        Assert.That(result, Is.Not.Null, "Expected array to be returned");
        Assert.That(result, Is.EquivalentTo(fileList));
    }
    

    【讨论】:

    • 这适用于具有公共构造函数的 System.Windows.Forms.DragEventArgs。 System.Windows.DragEventArgs (WPF) 是公共密封类,没有公共构造函数。
    • 感谢您使用内部构造函数将其密封。上帝保佑我们应该能够对我们的代码进行单元测试。
    【解决方案2】:

    仅将 DragEventArgs 类替换为您要在函数中使用的数据。 DragEventArgs 属于 UI,而不是 ViewModel。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 2012-08-03
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多