2013-12-14 36 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