我有一个用 C# (.NET 4.0) 编写的复杂 WPF 项目,我为 (NUnit) 编写了几个测试。这些测试位于不同的类中,只要我为每个类单独运行测试,一切都很好。但是,一旦我尝试一次运行所有类的所有测试,第一个类的测试成功,但是一旦 testrunner(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 或 testrunners 使用单个线程,在每个测试类运行后完全退出或类似的?
编辑1:到目前为止我已经尝试过:
[RequiresSTA]
用属性装饰测试- 在运行每个测试类之前重置 ResourceDictionaryManager 类(这是发生此错误的地方)。这解决了 ResourceDictionaryManager 类中的问题,但随后在代码中“稍后”出现完全相同的问题。
- 将所有测试复制到同一个巨大的类中。所有测试都运行良好(但这不是我想要的)
问题似乎是 NUnit 为每个包含测试方法的类使用不同的线程,所以我要么需要找到一种方法
- 告诉 NUnit 在同一个线程中运行所有测试类
或者
- 在 TestFixtureTearDown 方法中告诉 NUnit 完全关闭应用程序,以便我可以在下一个测试类中使用实例化一个新应用程序
new Application();