【发布时间】:2009-06-15 14:26:14
【问题描述】:
我正在尝试编写一个必须访问 UI 线程的测试用例。 Nunit 是否提供了一种访问 ui 线程的方法,或者无论如何我可以在我的测试用例中在 UI 线程上执行一些代码。 谢谢
更新:我正在使用 winform。通常的方法是拥有表示层并针对它编写测试用例,但在这种情况下,我需要使用一个网格并填充它,它的 DataSource 属性需要在 UI 线程上设置。
【问题讨论】:
标签: nunit
我正在尝试编写一个必须访问 UI 线程的测试用例。 Nunit 是否提供了一种访问 ui 线程的方法,或者无论如何我可以在我的测试用例中在 UI 线程上执行一些代码。 谢谢
更新:我正在使用 winform。通常的方法是拥有表示层并针对它编写测试用例,但在这种情况下,我需要使用一个网格并填充它,它的 DataSource 属性需要在 UI 线程上设置。
【问题讨论】:
标签: nunit
这在很大程度上取决于您为 UI 使用的技术。根据这一点,可能会设置 NUnit 运行器线程来充当您的 UI 线程。
但一般来说,建议将实际的 UI 层尽可能薄,以减少要测试的 UI 代码量。
如果您确实需要在 NUnit 线程上使用实时 WinForms 控件,请考虑使用Application.DoEvents(),它将处理消息队列中所有当前待处理的事件。请注意,这样做可能会给您带来other problems。
【讨论】:
您可以尝试NUnit Forms,但我赞同 David 的建议,即尽可能多地从 UI 层中提取逻辑。
【讨论】:
您可以在测试中指定一个“RequiresSTA”属性,该属性将在与 NUnit UI 相同的线程中运行。
我在尝试为 TIBCO Rendezvous 消息编写测试时发现了这一点。必须在主 UI 线程中设置监听器(怪 TIBCO,不是我!),否则调用 getAutoDispatchQueueGroup 会返回错误“对象无法完成请求的操作”。
我尝试使用 WindowsFormsSynchronizationContext 和 BeginInvoke,但均未成功。
【讨论】:
对于 NUnit 3+,我通过使用 [TestFixture, Apartment(ApartmentState.STA)] 声明测试类或使用 [Test, Apartment(ApartmentState.STA)] 声明测试方法来实现此功能。
【讨论】:
NUnit 没有内置支持 AFAIK。您当然可以在 UI 线程中执行代码,但“如何”取决于您使用的 UI 技术(WPF 或 Winforms)
寻找BeginInvoke() 之类的东西并传递一个匿名委托给它,您可以在单元测试中定义它
【讨论】: