gpt4 book ai didi

c# - 从单元测试项目启动和调用 WPF 应用程序的方法

转载 作者:太空宇宙 更新时间:2023-11-03 22:32:08 25 4
gpt4 key购买 nike

我想启动一个 WPF 应用程序并调用 ViewModel 上的方法来控制该应用程序以进行集成测试。像这样的东西:

    [Test]
public void Test1()
var application = new MyApp();
application.InitializeComponent();
application.Run();

(好的,这会在此时停止测试执行,大概是将控制权传递给 WPF 应用程序。不确定如何处理这个问题。在单独的线程或其他线程中启动?)

然后我希望能够在 ViewModel 上获取和设置值,如下所示:

        application.MyViewModel.SomeProperty = "A value!";

这里的目标是在不借助 WinAppDriver、White、CodedUI 或任何类似的困惑的情况下,以集成的方式测试 WPF 应用程序。想法?

最佳答案

您需要一个单独的线程来操作 View 模型,或者您需要在调度程序线程中执行代码来执行此操作。我更喜欢后者,但两者都行。前者要求您谨慎使用调度程序将某些操作编码到 UI 线程; View 模型属性更改不需要这样做,因为 WPF 会自动为您执行此操作,但其他事情如直接调用 UI 对象方法——例如Window.Close() — 做。

下面是您可以使用调度程序线程执行所有测试代码的示例:

[TestMethod]
public void TestWpfApp()
{
Thread thread = new Thread(() =>
{
var application = new App();
Application.ResourceAssembly = System.Reflection.Assembly.GetExecutingAssembly();
application.InitializeComponent();
application.Dispatcher.InvokeAsync(() =>
{
_TestApplication(application);
}, System.Windows.Threading.DispatcherPriority.ApplicationIdle);
application.Run();
});

thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}

private static async void _TestApplication(Application application)
{
Window window = application.MainWindow;
ViewModel viewModel = (ViewModel)window.DataContext;

await Task.Delay(TimeSpan.FromSeconds(5));
viewModel.Text = "Hello World!";
await Task.Delay(TimeSpan.FromSeconds(5));
window.Close();
}

基本结构是设置一个适合运行WPF UI的线程(它必须是一个STA线程,你不应该与单元测试的线程混为一谈,因此需要为此创建一个新线程),然后在该线程中,通过 InvokeAsync() 执行通常的 WPF 设置和队列向调度程序调用主要测试方法,以便在 WPF 代码开始运行后开始执行。

当然,这个例子假设一个 ViewModelText属性,以及主窗口的 DataContext属性设置为此 ViewModel 的一个实例.在我的示例程序中,我只是绑定(bind)了 Text属性(property)给TextBlock.Text属性(property)。显然,您可以对 View 模型做任何您想做的事情。

请注意,我必须明确设置 Application.ResourceAssembly .在我目前使用的 Visual Studio Community 2017 中,单元测试框架在 Assembly.GetEntryAssembly() 的上下文中运行文本。返回 null ,这会中断 WPF 的资源加载。设置它明确修复了(我正在使用 Assembly.GetExecutingAssembly() ,因为我将单元测试代码与我的示例 WPF 程序放在同一个程序集中......显然,如果你将它们放在不同的程序集中,你必须找到正确的程序集其他方式)。

在我的测试中,使用 System.Windows.Threading.DispatcherPriority.ApplicationIdle在调用 Dispatch.InvokeAsync()没有严格要求。我找到了 MainWindowDataContext属性初始化正常。但我更愿意明确地等待 ApplicationIdle ,只是为了确保它们已完全初始化,并且 WPF 程序本身已准备好开始接受您为测试准备的任何输入。

关于c# - 从单元测试项目启动和调用 WPF 应用程序的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56999910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com