【问题标题】:Accessing UI Thread in nunit在 nunit 中访问 UI 线程
【发布时间】:2009-06-15 14:26:14
【问题描述】:

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

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

【问题讨论】:

    标签: nunit


    【解决方案1】:

    这在很大程度上取决于您为 UI 使用的技术。根据这一点,可能会设置 NUnit 运行器线程来充当您的 UI 线程。

    但一般来说,建议将实际的 UI 层尽可能薄,以减少要测试的 UI 代码量。


    如果您确实需要在 NUnit 线程上使用实时 WinForms 控件,请考虑使用Application.DoEvents(),它将处理消息队列中所有当前待处理的事件。请注意,这样做可能会给您带来other problems

    【讨论】:

    • 大卫我完全同意,但我的情况并没有给我任何选择。我有正在处理的基础网格(wingrid),我需要获取过滤器。为此,我需要填充它(grid.Datasource = data)。除非在 UI 线程上执行,否则 Grid 不会自行填充。我使用的技术是 Win forms
    【解决方案2】:

    您可以尝试NUnit Forms,但我赞同 David 的建议,即尽可能多地从 UI 层中提取逻辑。

    【讨论】:

      【解决方案3】:

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

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

      我尝试使用 WindowsFormsSynchronizationContext 和 BeginInvoke,但均未成功。

      【讨论】:

        【解决方案4】:

        对于 NUnit 3+,我通过使用 [TestFixture, Apartment(ApartmentState.STA)] 声明测试类或使用 [Test, Apartment(ApartmentState.STA)] 声明测试方法来实现此功能。

        另见this related question

        【讨论】:

          【解决方案5】:

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

          寻找BeginInvoke() 之类的东西并传递一个匿名委托给它,您可以在单元测试中定义它

          【讨论】:

          • 据我了解,BeginInvoke 将在实例化它的线程上调用传递的委托。如果我在非 ui 线程上创建一个控件,那么它将不会在 UI 线程上执行它。如果我错了,请纠正我。
          • 不,它将始终在 UI 线程上运行(例如,为 Winforms 执行 Application.Run 的线程)
          猜你喜欢
          • 2010-10-17
          • 2021-12-04
          • 2015-06-02
          • 2016-09-17
          • 1970-01-01
          • 1970-01-01
          • 2018-04-27
          相关资源
          最近更新 更多