我正在尝试编写一个测试用例,我必须访问UI Thread。 Nunit是否提供了访问ui线程的方法,或者无论如何我可以在我的测试用例中在UI Thread上执行一些代码。 感谢
更新:我正在使用winform。通常的方法是使用表示层并针对它编写测试用例,但在这种情况下,我需要使用一个网格并填充它,需要在UI线程上设置其DataSource属性。
答案 0 :(得分:3)
这在很大程度上取决于您使用的UI技术。根据具体情况,可以设置NUnit运行程序线程作为UI线程。
但总的来说,建议尽可能减少实际的UI层,以减少要测试的UI代码量。
如果您确实需要在NUnit线程上使用实时WinForms控件,请考虑使用Application.DoEvents()来处理消息队列中所有当前挂起的事件。请注意,这样做可能会为您带来other problems。
答案 1 :(得分:2)
你可以尝试NUnit Forms,但我要求大卫建议尽可能多地从UI层中获取逻辑。
答案 2 :(得分:2)
您可以在测试中指定'RequiresSTA'属性,该属性将在与NUnit UI相同的线程中运行。
我在尝试为TIBCO Rendezvous消息编写测试时发现了这一点。必须在主UI线程中设置监听器(责备TIBCO,而不是我!),否则对getAutoDispatchQueueGroup的调用将返回错误“对象无法完成请求的操作”。
我尝试使用WindowsFormsSynchronizationContext和BeginInvoke,但都没有工作。
答案 3 :(得分:1)
对于NUnit 3+,我通过在[TestFixture, Apartment(ApartmentState.STA)]
上声明测试类或在[Test, Apartment(ApartmentState.STA)]
上声明测试方法来完成这项工作。
另请参阅https://docs.microsoft.com/en-us/dotnet/standard/choosing-core-framework-server。
答案 4 :(得分:0)
NUnit没有内置支持AFAIK。您当然可以在UI线程中执行代码,但'how'取决于您使用的UI技术(WPF或Winforms)
查找BeginInvoke()
之类的内容并传递一个匿名代表,您可以在单元测试中定义