gpt4 book ai didi

c# - 在不将 WPF 控件添加到窗口的情况下测试它

转载 作者:可可西里 更新时间:2023-11-01 08:20:07 29 4
gpt4 key购买 nike

我有一个 UserControl,它在其 Loaded 事件中发布一个 EventAggregator 消息。为了对此进行测试(并引发 Loaded 事件),我目前正在创建一个窗口并将控件添加到其中,然后等待引发 Loaded 事件。

有没有什么方法可以设置一个测试,以便在不必创建控件并将控件添加到窗口的情况下触发 Loaded 事件?

例如:

[Test, RequiresSTA]
public void active_thingy_message_is_published_on_loaded()
{
const string TestMsg = "Active thingy changed";

using (AutoResetEvent loadedEvent = new AutoResetEvent(false))
{
DummyEventService eventService = new DummyEventService();
DummyControl control = new DummyControl(eventService, TestMsg);
control.Loaded += delegate { loadedEvent.Set(); };

Assert.That(eventService.Message, Is.Null, "Before.");
Window window = new Window { Content = control };
window.Show();
loadedEvent.WaitOne();
window.Dispatcher.InvokeShutdown();
Assert.That(eventService.Message, Is.EqualTo(TestMsg), "After.");
}
}

private class DummyControl : UserControl
{
public DummyControl(DummyEventService eventService, string testMsg)
{
Loaded += delegate { eventService.Publish(testMsg); };
}
}

private class DummyEventService
{
public string Message { get; private set; }
public void Publish(string msg) { Message = msg; }
}

更新

我已将标题从“单元测试...”更改为“测试...”,并将标签“单元测试”替换为“测试”。

我不想就这到底是什么类别的测试争论不休,因为它没有建设性。是的,可以说这不是“单元测试”,但这没有帮助。我想测试一个依赖于控件生命周期的问题,这涉及 Loaded 事件。这是一个重要的回归测试,因为我无法控制的第 3 方组件取决于在 Loaded 时引发的消息。

是否可以在不将控件添加到窗口的情况下引发 Loaded 事件?

最佳答案

如果您只对触发目标控件的 Loaded 事件感兴趣,那么反射应该可以解决问题。

public static void RaiseLoadedEvent(FrameworkElement element)
{
MethodInfo eventMethod = typeof(FrameworkElement).GetMethod("OnLoaded",
BindingFlags.Instance | BindingFlags.NonPublic);

RoutedEventArgs args = new RoutedEventArgs(FrameworkElement.LoadedEvent);

eventMethod.Invoke(element, new object[] { args });
}

这实际上会触发每个 FrameworkElement 中存在的 OnLoaded 方法,因此如果您的测试需要应用程序状态,这将不起作用。

此外,父项的 Loaded 事件与其子项之间没有任何关系。如果测试需要子元素触发其 Loaded 事件,则辅助方法将需要手动遍历子控件并触发它们。

关于c# - 在不将 WPF 控件添加到窗口的情况下测试它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128212/

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