2012-09-10 147 views
4

我試圖單元測試這種方法是從我的ViewModel叫:如何嘲笑DragEventArgs

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

我有這個方法有線了卡利。我知道這是一個幾乎完全使用框架類的非常簡單的方法,但我認爲它仍然需要測試。問題是,Moq不能模擬DragEventArgs。有沒有辦法解決這個問題,或者我應該不打擾測試這種方法?

回答

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)); 
} 
+4

這是爲System.Windows.Forms.DragEventArgs具有公共構造函數。 System.Windows.DragEventArgs(WPF)是公共密封類,沒有公共構造函數。 – Vili

+1

感謝您使用內部構造函數進行密封。上帝禁止我們應該能夠單元測試我們的代碼。 – 2013-06-27 17:34:39

2

用僅包含要在函數中使用的數據替換DragEventArgs類。 DragEventArgs屬於UI,而不是ViewModel。