如何在 FlaUI/WPF Window 中注入模拟?

How to Inject Mocks in FlaUI/WPF Window?

在我的 WPF 应用程序中,我有一个 MainWindow.xaml 和一个相关的 MainWindow.xaml.cs。后者有一个 属性 DatabaseAccessor 访问数据库:

public partial class MainWindow : System.Windows.Window
{
    public IDatabaseAccessor DatabaseAccessor { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        DatabaseAccessor = new RealDatabaseAccessor();
    }

    // [...]
}

现在我正在使用 FlaUI 编写测试。在我的测试中,我正在写类似

using FlaUI.UIA3;
using Moq;

var app = FlaUI.Core.Application.Launch("myapp.exe");
using (var automation = new UIA3Automation())
{
    FlaUI.Core.AutomationElements.Window window = app.GetMainWindow(automation);

    //// I am looking for a way to do something like this (but no such API exists):
    // MainWindow myWindow = (MainWindow) window.RealWindow;
    // myWindow.DatabaseAccessor = new Mock<IDatabaseAccessor>().Object;
}

对于我的测试,我不想与真实数据库通信而是模拟它。

如何将模拟的 DatabaseAccessor 注入到使用 FlatUI 打开的 Window 中(请参阅我最后一个片段中的注释代码)?或者换句话说:如何访问给定 FlaUI.Core.AutomationElements.WindowSystem.Windows.Window

如果这不可能,您将如何处理这样的问题?

你需要重新考虑你在这里做什么。

UI 自动化 测试不应该模拟依赖项。它在单独的进程中启动您的应用程序,并使用屏幕上显示的实际元素与其交互。

如果您想测试代码中的特定组件,您应该针对该组件编写单元测试。然后您可以模拟任何外部依赖项。