2013-12-14 32 views
1

我有一個WPF視圖模型,有這將打開一個文件對話框像這樣的命令:如何墊片OpenFileDialog.ShowDialog方法

var dlg = new OpenFileDialog(); 
var result = dlg.ShowDialog(); 

現在我想進行單元測試該命令。 ShowDialog的距離的CommonDialog繼承的方法,所以我認爲我能勻它是這樣的:

Microsoft.Win32.Fakes.ShimCommonDialog.AllInstances.ShowDialog =() => true; 

,但我發現下面的編譯錯誤:

Delegate Microsoft.QualityTools.Testing.Fakes.FakesDelegates.Func<Microsoft.Win32.CommonDialog,bool?> does not take 0 arguments

任何想法?

+0

我不確定這是否有幫助,但沒有對話返回一個DialogResult,而不是一個布爾?也許通過指定一個bool,你可以使用一個不同的委託來傳遞一個參數。 –

+0

ShowDialog返回nullable bool即「bool?」 – filip

+0

@CodeontheCommode:你正在考慮Form.ShowDialog。如filip所說,OpenFileDialog返回一個可爲空的布爾值。 –

回答

5

下面的代碼將實現你所需要的。

被測系統(SUT)

public class Sut 
{ 
    public bool SomeMethod() 
    { 
     var dlg = new OpenFileDialog(); 
     var result = dlg.ShowDialog(); 
     return result.Value; 
    } 
} 

單元測試(使用MS假貨)

using System; 
using Microsoft.QualityTools.Testing.Fakes; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 
using Microsoft.Win32.Fakes; 
using WpfApplication1; 

    [TestMethod] 
    public void SomeTest() 
    { 
     using (var context = ShimsContext.Create()) 
     { 
      Nullable<bool> b2 = true; 
      ShimCommonDialog.AllInstances.ShowDialog = (x) => b2; 

      var sut = new Sut(); 

      var r = sut.SomeMethod(); 

      Assert.IsTrue(r); 
     } 
    } 

請注意,您需要有PresentationFramework.4.0.0.0.Fakes組件以及您的測試中正確的附加Fakes組件。

+0

好的,所以我錯過了這個x - 爲什麼它需要在那裏,如果OpenDialog沒有參數? – filip

+0

它確實需要一個參數,它需要打開一個對話框的實例。它可能是一個擴展方法,或者有一個可選參數。 – Magus

+0

感謝它爲我工作。 – user2323308