【发布时间】:2011-10-30 23:44:49
【问题描述】:
我有一个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 事件吗?
【问题讨论】:
-
你将不得不伪造/模拟窗口......但这看起来不再像单元测试了。
-
@Henk 你如何看到一个伪造的窗口导致我的用户控件被加载,从而触发它的
Loaded事件? -
您可以尝试通过反射引发 Load 事件:stackoverflow.com/questions/198543/…
-
@mike 我怀疑 WPF 事件的实现方式不同。我无法使用链接中的方法大纲通过反射看到事件支持字段。已经尝试过这种方法,但会进一步挖掘。谢谢。
-
@Merlyn 我已经更新了示例单元测试。
标签: c# wpf testing user-controls