gpt4 book ai didi

c# - 尝试从资源字典访问图像资源时多个 NUnit 测试类失败

转载 作者:太空狗 更新时间:2023-10-30 00:32:58 24 4
gpt4 key购买 nike

我有一个用 C# (.NET 4.0) 编写的复杂 WPF 项目,我为 (NUnit) 编写了几个测试。这些测试位于不同的类中,只要我分别为每个类运行测试,一切都很好。但是,一旦我尝试一次运行所有类的所有测试,第一个类的测试就会成功,但是一旦测试运行器(Resharper 或 nunit-console)开始测试剩余的类,它们都会失败,并显示以下堆栈跟踪。

System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it
at System.Windows.Threading.Dispatcher.VerifyAccess()
at System.Windows.Media.Imaging.BitmapDecoder.ToString()
at System.Windows.Media.Imaging.BitmapFrameDecode.ConvertToString(String format, IFormatProvider provider)
at System.Windows.Media.ImageSource.ToString()
at MUSTANG.ShowCase.ResourceLibrary.ResourceDictionaryManager.GetUriString(String pKey) in c:\Daten\Jenkins-ci\jobs\MUSTANG-Showcase-Release-VS2010\workspace\MUSTANG-Showcase\MUSTANG.ShowCase.ResourceLibrary\ResourceDictionaryManager.cs:Zeile 49.

对应的代码如下:

public object GetValue(string pKey)
{
if (mDictionary.Contains(pKey))
{
return mDictionary[pKey];
}
return null;
}

public String GetUriString(string pKey)
{
object result = GetValue(pKey);
if (null == result)
{
Log.Warn(string.Format(@"Ressource '{0}' nicht gefunden!", pKey));
return "";
}
return result.ToString();
}

当资源是图像时,异常发生在 GetUriString 的最后一行。 Nunit 似乎使用不同的线程来运行不同的测试类——它们仍然按顺序运行。有没有办法解决这个问题,例如通过告诉 NUnit 或测试运行者使用单线程,在每次测试类运行后完全退出或类似的?

编辑 1:到目前为止我尝试了什么:

  • 使用 [RequiresSTA] 属性装饰测试
  • 在运行每个测试类之前重置 ResourceDictionaryManager 类(这是发生此错误的地方)。这解决了 ResourceDictionaryManager 类中的问题,但“稍后”在代码中出现完全相同的问题。
  • 将所有测试复制到同一个巨大的类中。所有测试都运行良好(但这不是我想要的)

问题似乎是 NUnit 为每个包含测试方法的类使用不同的线程,所以我要么需要找到一种方法来

  • 告诉 NUnit 在同一个线程中运行所有测试类

  • 在 TestFixtureTearDown 方法中告诉 NUnit 完全关闭应用程序,这样我就可以在下一个测试类中使用 new Application();
  • 实例化一个新应用程序

最佳答案

从堆栈跟踪来看,您发布的内容似乎存在“线程亲和性”问题 - 即您正尝试在与创建它的线程不同的线程上更新 UI 元素。BitmapDecoder 派生自 DispatcherObject 即它需要在单个线程上运行。在您的测试运行中,它似乎是在一个线程上创建的,然后方法调用 (ToString) 是从另一个线程进行的。

  • 您确定您没有在代码中生成线程吗? NUnit AFAIK 使用相同的线程来运行测试运行中的所有测试。你运行的是什么版本?
  • 您是否在测试之间共享相同的 MUSTANG.ShowCase.ResourceLibrary 实例?如何为每个测试创建一个新实例,即隔离测试?

更新:我想我现在已经确定了。

  • 如果测试夹具仅标记有 TestFixture 属性(无线程要求),则所有测试都在单个 MTA 线程上运行
  • 如果您使用 RequiresSTA 属性标记每个 TestFixture,我看到运行器将为每个测试夹具创建一个新的 STA 线程(这似乎与您报告的内容相符)。
  • 由于您希望所有测试(跨固定装置)都在同一个 STA 线程上进行,因此您应该在程序集级别(在 AssemblyInfo.cs 文件中)指定它。您可以在每个灯具级别删除该属性。

.

[assembly: RequiresThread(ApartmentState.STA)]

关于c# - 尝试从资源字典访问图像资源时多个 NUnit 测试类失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14332636/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com