如何模拟DragEventArgs

时间:2012-09-10 18:38:40

标签: wpf unit-testing mocking moq

我正在尝试对从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联系起来。我知道这是一个非常简单的方法,几乎​​只使用框架类,但我觉得它仍然需要测试。问题是,Moq无法模拟DragEventArgs。有没有办法解决这个问题,还是我不打算尝试这种方法?

2 个答案:

答案 0 :(得分:3)

希望我没有错过Calibrun的任何内容,但为什么在你创建一个时可以模拟DragEventArgs?重要的部分是IDataObject部分,它是一个界面,很容易被模拟。

[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));
}

答案 1 :(得分:2)

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