【发布时间】:2015-01-24 02:15:55
【问题描述】:
我无法摆脱这个问题。这很奇怪,当我尝试在 Debug 模式下运行我的 NUnit 测试时,我得到了预期的结果,但是当我正常运行它时,结果是错误的。
我想要做的是检测绑定错误。这是一个示例
[TestFixture, RequiresSTA]
public class BindingTests
{
[Test]
public void T1_BindingErrorsExpected()
{
string error = null;
using (var listener = new ObservableTraceListener())
{
listener.TraceCatched += s => error = s;
TextBlock myText = new TextBlock();
UserControl control = new UserControl();
Binding myBinding = new Binding("BadBinding");
myBinding.Source = control;
myText.SetBinding(TextBlock.BackgroundProperty, myBinding);
}
Assert.IsNotNull(error);
}
}
还有 ObservableTraceListener
public sealed class ObservableTraceListener : DefaultTraceListener
{
private readonly StringBuilder _Builder = new StringBuilder();
public ObservableTraceListener()
{
PresentationTraceListener.Add(SourceLevels.Error, this);
}
public new void Dispose()
{
Flush();
Close();
PresentationTraceListener.Remove(this);
base.Dispose();
}
public override void Write(string message)
{
_Builder.Append(message);
}
public override void WriteLine(string message)
{
Write(message);
if (TraceCatched != null)
TraceCatched(_Builder.ToString());
_Builder.Clear();
}
public event Action<string> TraceCatched;
}
public static class PresentationTraceListener
{
public static void Add(SourceLevels level, TraceListener trace)
{
PresentationTraceSources.DataBindingSource.Listeners.Add(trace);
PresentationTraceSources.DataBindingSource.Switch.Level = level;
PresentationTraceSources.ResourceDictionarySource.Listeners.Add(trace);
PresentationTraceSources.ResourceDictionarySource.Switch.Level = level;
}
public static void Remove(TraceListener trace)
{
PresentationTraceSources.DataBindingSource.Listeners.Remove(trace);
PresentationTraceSources.ResourceDictionarySource.Listeners.Remove(trace);
}
}
调试结果 -> 失败(我所期望的)
运行结果-> 成功(不是预期的)
【问题讨论】:
-
我猜这与 DefaultTraceListener 的副作用有关,它试图调用旧式跟踪机制 (OutputDebugString)。使用它作为基类而不是从 TraceListener 派生的动机是什么?
-
没有具体原因。明天我会尝试实现traceListener,我会给你反馈
-
我刚刚用
public sealed class ObservableTraceListener : TraceListener而不是public sealed class ObservableTraceListener : DefaultTraceListener进行了测试,并没有解决问题。 -
我刚刚更新了我的示例,当我处于调试模式时,myText.SetBinding() 会引发对 TraceListner 的调用。在运行模式下,setBinding 方法不会抛出。如果这可以帮助...
标签: c# unit-testing binding nunit tracelistener