LINQPad:Assert() 打印 "Fail:" 并继续而不是中断

LINQPad: Assert() prints "Fail:" and continues instead of breaking

在 LINQPad 中,System.Diagnostics 命名空间中的 Debug.Assert()Trace.Assert() 未按预期工作。

而不是中断 - 即弹出消息框或任何其他碰巧为 <trace> 配置的东西 - 他们只是打印 "Fail:" 或 "Fehler:" 到输出 window 让程序继续其快乐的方式。换句话说,不是嘈杂的、不可忽视的爆炸,只有几乎看不见的 micro-farts 散布在 "Fail:" 到文本输出中。

有什么方法可以让 Assert() 恢复到 LINQPad 下的默认行为?

或者,是否有一种简单的方法来模拟 Trace.Assert(),以便失败导致嘈杂的爆炸(即异常、消息框等),并以行号或类似的?

我的单元测试基于 Trace.Assert(),如果函数不能在失败点中断程序,那么它们就完全没用了。

在 Visual Studio 中一切正常,但在 LINQPad 中不正常。我没有摆弄任何 system-wide 设置,但我确实在某个时间点安装了 Mono。我仔细梳理了 LINQPad 中的所有设置,但无济于事。 LINQPad 版本为 4.57.02 (non-free),运行 Windows 7 Pro(德语)和 Windows 8.1 Pro(英语)。

我用谷歌搜索了一下,但我唯一能找到的是 Stack Overflow 上的主题 Trace.Assert not breaking, neither showing the message box。它的标题看起来很有前途,但其中的答案却并非如此。

P.S.: 我试着通过添加

来模拟
class Trace
{
    public static void Assert (bool condition)
    {
        if (!condition)
            throw new Exception("FAIL!");
    }
}

到 LINQ 脚本并在 throw 语句上设置断点。单击 LINQPad 调试器中的相关调用堆栈条目会将我带到相关的源代码行,这样就可以了。但是,我找不到与 FoxPro 的 SET DEBUG ON 等效的方法来直接从源代码调用调试器,而不必在 throw...

上设置断点

要回答问题的后半部分,即如何在抛出异常时让 LINQPad 调试器中断,答案是单击工具栏上的任一 'Bug' 图标。

单击异常未处理时中断(红色错误)可在抛出未处理的异常时中断查询。

单击抛出异常时中断(蓝色错误)使您的查询在抛出异常时中断,无论它是否被处理。

您可以通过右键单击并选择设置为默认值,让 LINQPad 将任一设置设为默认值。 (这样做会强制调试器始终附加到您的查询,这会产生很小的性能成本。)

至于为什么Debug.Assert(false)不显示对话框,这是因为LINQPad中没有实现这个行为。通过将以下代码添加到 My Extensions:

,您可以轻松地将其实现为扩展
public class NoisyTracer : TextWriterTraceListener
{
    public static void Install()
    {
        Trace.Listeners.Clear();
        Trace.Listeners.Add (new NoisyTracer (Console.Out));
    }

    public NoisyTracer (TextWriter writer) : base (writer) { }

    public override void Fail (string message, string detailMessage)
    {
        base.Fail (message, detailMessage);
        throw new Exception ("Trace failure: " + message);
    }
}

然后,要启用,请按如下方式编写您的查询:

NoisyTracer.Install();
Debug.Assert (false);