2009-06-15 68 views
2

我想写一个测试用例,我必须访问UI线程。 Nunit提供了一种访问ui线程的方法,或者无论如何我都可以在我的测试用例的UI线程上执行一些代码。 谢谢在nunit中访问UI线程

更新:我正在使用winform。通常的方法是拥有表示层并针对它编写测试用例,但在这种情况下,我有一个需要使用的网格并填充它,它的DataSource属性需要在UI线程上设置。

回答

3

这很大程度上取决于您用于UI的技术。根据不同的情况,可以将NUnit runner线程设置为UI线程。

尽管如此,建议尽可能减少实际的UI层以减少要测试的UI代码的数量。


如果你真的需要对你的NUnit的线程现场的WinForms控制,可以考虑使用Application.DoEvents()将处理在消息队列中的所有目前正在等待事件。请注意,这样做可能会为您带来other problems

+0

大卫我完全同意,但我的情况并没有给我任何选择。我有我正在研究的infragistic grid(wingrid),我需要获取过滤器。要做到这一点,我需要对它进行制作(grid.Datasource = data)。网格不会自行填充,除非它在UI线程上执行。我使用的技术是Win forms – Sheraz 2009-06-15 14:39:08

0

NUnit没有内置支持AFAIK。当然,你可以在你的UI线程中执行代码,但'如何'取决于你使用的UI技术(WPF或Winforms)

寻找类似BeginInvoke()的东西,并传递一个匿名代理给你,你可以在你的单元测试

+0

http://weblogs.asp.net/justin_rogers/pages/126345.aspx – slf 2009-06-15 14:31:59

2

你可以尝试NUnit Forms,但我想大卫的建议是尽可能多地从UI层获取逻辑。

2

您可以在测试中指定一个'RequiresSTA'属性,它将在与NUnit UI相同的线程中运行它。

我在尝试编写TIBCO Rendezvous消息的测试时发现了这个问题。监听器必须设置在主UI线程(非TIBCO,不是我!),否则调用getAutoDispatchQueueGroup会返回一个错误“对象无法完成请求的操作”。

我尝试使用WindowsFormsSynchronizationContext和BeginInvoke,都没有工作。