【问题标题】:How to shim OpenFileDialog.ShowDialog method如何填充 OpenFileDialog.ShowDialog 方法
【发布时间】:2014-01-02 09:29:36
【问题描述】:

我有一个 WPF ViewModel,它有一个打开文件对话框的命令,如下所示:

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

现在我想对该命令进行单元测试。 ShowDialog 是从 CommonDialog 继承的方法,所以我假设我可以像这样填充它:

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

但我收到以下编译错误:

委托Microsoft.QualityTools.Testing.Fakes.FakesDelegates.Func<Microsoft.Win32.CommonDialog,bool?> 不接受 0 个参数

有什么想法吗?

【问题讨论】:

  • 我不确定这是否有帮助,但不是一个对话框返回一个 DialogResult,而不是一个布尔值?也许通过指定一个布尔值,您会导致使用不同的委托,该委托需要传入一个参数。
  • ShowDialog 返回可为空的 bool 即“bool?”
  • @CodeontheCommode:您正在考虑 Form.ShowDialog。正如 filip 所说,OpenFileDialog 返回一个可为空的 bool。

标签: c# unit-testing microsoft-fakes


【解决方案1】:

下面的代码可以满足你的需要。

被测系统 (SUT)

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

单元测试(使用 MS Fakes)

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 程序集。

【讨论】:

  • 好的,所以我错过了这个 x - 如果 OpenDialog 不带参数,为什么需要它?
  • 它确实需要一个参数,它需要一个它打开的对话框的实例。可以是扩展方法,也可以是可选参数。
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 2020-09-01
  • 2021-05-18
相关资源
最近更新 更多