如何对创建DependencyObjects的Silverlight ValueConverters进行单元测试

时间:2011-11-11 09:53:52

标签: silverlight unit-testing nunit dependencyobject

我有一个Silverlight ValueConverter应该使用enum并将其转换为Brush。像这样简化的例子:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var brush = new SolidColorBrush(Colors.Blue);
    var entryType = (EntryType)value;
    if (entryType == EntryType.Hour)
        brush.Color = Colors.Red;
    return (brush);
}

如果我想对它进行单元测试,它将无法正常工作。我得到了这个例外:

System.TypeInitializationException : The type initializer for 'MS.Internal.JoltHelper' threw an exception.
----> System.IO.FileNotFoundException : Could not load file or assembly 'System.Xml, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e' or one of its dependencies. 
at MS.Internal.JoltHelper.get_ThreadID()
at MS.Internal.XcpImports.CheckThread()
at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex, IntPtr constructDO)
...

我知道这是因为在我的(NUnit)单元测试中,加载的CLR与运行Silverlight应用程序时不同。我知道I shouldn't test UI in unit-tests,但这只是测试我的ValueConverter,所以我认为这是一个有效的测试。

有谁知道这是否以及如何测试?

2 个答案:

答案 0 :(得分:1)

我认为这里的主要问题是您尝试在非Silverlight运行时运行Silverlight代码。

昨天或前一天我写了一个与你的版本大致相同的ValueConverter。我也为它写了一些测试。我使用Silverlight Toolkit附带的Silverlight单元测试运行器运行测试,测试都运行正常。

我建议在Silverlight运行时运行Silverlight测试,即在浏览器插件中运行。您可以使用我上面提到的Silverlight单元测试框架,您也可以尝试使用a port of NUnit to Silverlight。但是,我不知道这个Silverlight NUnit端口是多么最新。

答案 1 :(得分:0)

除了Luke的回答之外,我建议您使用Deployment.Current.Dispatcher查看在UI线程上调用代码的位置。这可能会导致MS.Internal.JoltHelper例外。