wpf ShowDialog在使用.NET核心6时停止

iqxoj9l9  于 2023-02-05  发布在  .NET
关注(0)|答案(1)|浏览(158)

我正在从. NET Framework升级到. NET Core,但ShowDialog出现问题。在. NET Framework和单元测试中,ShowDialog点击命令并继续处理,但在. NET Core中,ShowDialog启动一个新线程并停留在那里,直到手动选择一个按钮。这不能与单元测试一起工作。
这行代码:

tabControl.SelectTabItem(1); // FlaUI command

导致弹出窗口显示,但我需要选择一个网格项和一个确定按钮。我的问题是如何不拖延ShowDialog操作?
这是对话框的图片:

单元测试位于自己的项目中,并调用另一个项目中的对话框,如下所示:

tableSelection = new DatabaseTableSelection(filePath, contr);
       tableSelection.Topmost = true;
       tableSelection.ShowDialog();
       if (tableSelection.selectedTable == null)
       {
          return false;
       }

看起来我需要模拟这个,但是我从来没有用过模拟。有什么想法吗?

w8biq8rn

w8biq8rn1#

您不应该在任何正在进行单元测试的方法中使用ShowDialog,也不应该在任何其他类型的对话框或UI中使用ShowDialog
一个可能的解决方法是注入一个接口,类似于IMessageDialog,可以在单元测试中模拟。
例如:

public interface IDatabaseTableDialog
{
    bool ShowTable(string filepath, Control parentControl);
}
public class MockDatabaseTableDialog : IDatabaseTableDialog
{
    public bool ShowTable(string filepath, Control parentControl) => true;
}
public class DatabaseTableDialog : IDatabaseTableDialog
{
    public bool ShowTable(string filepath, Control parentControl)
    {
        var tableSelection = new DatabaseTableSelection(filepath, parentControl);
        tableSelection.Topmost = true;
        tableSelection.ShowDialog();
        if (tableSelection.selectedTable == null)
        {
            return false;
        }

        return true;
    }
}

注意,如果你能把所有的功能封装到一个方法中,模拟会更容易,否则你可能需要两个接口,一个用于创建对话框,另一个用于对话框本身。
但是UI越复杂,模拟就越复杂,这使得单元测试编写起来越慢,价值也就越低。
所以我倾向于使用的方法是确保ShowDialog或任何其他类型的UI被限制在特定的UI类或viewModel中,并尝试将任何复杂的逻辑从这些类中移走。这样就可以用单元测试来测试复杂的逻辑,并进行手动测试来检查UI是否按预期工作。有一些工具可以自动进行UI测试,但我还没有看到一个我认为值得努力的。

相关问题