【问题标题】:Moq with c# System.Windows.MessageBoxButton.YesNoCancel最小起订量与 c# System.Windows.MessageBoxButton.YesNoCancel
【发布时间】:2017-03-21 18:58:45
【问题描述】:

我目前正在围绕程序的 WPF 模块编写一些单元测试。我已经到了ShowMessage 在语句中返回YesNo 值的地步。

dService.ShowMessage(view, args);

args 采用 lambda 作为(缩短)

new MessageArgs(arg1, arg2, arg3, (la) => 
{
   if (la.result == messResult.yes)
   {
   // do something
   }
}

我现在正在尝试模拟从这个 lambda 返回的结果,但遇到了一些困难,并且无法找到有类似问题的人。

我尝试在单元测试中的 lambda 中设置默认结果:

new MessageArgs(arg1, arg2, arg3, (la) => 
{
   if (la.result == messResult.yes)
   {
       la.result = messResult.yes;
   }
}

尝试将语句下方的 arg 结果设置为:

args.result = messResult.yes;

我也尝试过将 Setup 用作:

dServiceMock.Setup(x => x.ShowMessage)

但没有返回属性,因为ShowMessage 是一个 void 函数。

在我的单元测试中,没有人显示操作发生变化。有没有其他人遇到过类似的“问题”并找到解决方案或知道一些关于此的文档?如果我在此期间发现一些东西,我会更新这个。

谢谢。

【问题讨论】:

  • 你不能把这个方法包装在另一个返回布尔值并对新方法进行单元测试的方法中吗?任何其他方式都称为 UI 测试(测试消息框中显示的实际消息)。
  • 你能展示你想要单元测试的代码吗?
  • 检查this是否可以让您对抽象UI交互的问题有所了解
  • @user3185569 我现在无法编辑项目的源代码,这会导致问题,因为它显然不是为了测试而编写的。
  • @AlexeiLevenkov 我无法显示完整的代码,因为它是我公司的代码库,我不确定它们会是什么样子,但如果您需要一些细节,我可以创建一些“模拟”游戏。

标签: c# wpf unit-testing moq


【解决方案1】:

如果dService 不是sealed 类的实例,请创建一个子类,以您测试所需的方式覆盖ShowMessage 方法。

编辑:

问题是由封装两个(或更多)操作的dService.ShowMessage(view, args) 调用引起的:
- 调用 view.ShowMessage
- 使用 view.ShowMessage 的结果调用包含在 args 中的 lambda

现在您必须创建您的dService.ShowMessage(view, args),这样:
- 它不显示视图
- 它改为假设该操作的结果
- 调用具有所需结果的 lambda

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 2011-12-25
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多