正如 Henk 已经指出的,抑制 UI 是没有用的,因为您希望您的代码失败。当您不想更改代码时,可以编写一个引发异常的自定义跟踪侦听器,如下所示:
public class ProductionTraceListener : DefaultTraceListener
{
public override void Fail(string message, string detailMessage)
{
string failMessage = message;
if (detailMessage != null)
{
failMessage += " " + detailMessage;
}
throw new AssertionFailedException(failMessage);
}
}
[Serializable]
public class AssertionFailedException : Exception
{
public AssertionFailedException() { }
public AssertionFailedException(string message) : base(message) { }
public AssertionFailedException(string message, Exception inner)
: base(message, inner) { }
protected AssertionFailedException(SerializationInfo info,
StreamingContext context) : base(info, context) { }
}
你可以按如下方式注册:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<trace>
<listeners>
<clear />
<add name="Default"
type="[Namespace].ProductionTraceListener, [Assembly]" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
正如您对跟踪侦听器的名称 ProductionTraceListener 所期望的那样,我在我的生产环境(Web 应用程序)中使用了那个东西,而不是在我的单元测试中。虽然您可以在单元测试中使用此技巧,但我建议您更改代码。 IMO 你应该只对不应该运行的代码路径使用断言,如果他们这样做,测试应该失败。在您的情况下,您希望在断言失败时进行成功的测试,这是违反直觉的。
我的建议是更改代码并使用普通的if (x) throw ArgumentException() 检查前提条件(或使用CuttingEdge.Conditions)并将这些断言仅用于不应运行的代码路径。还可以尝试使用Trace.Assert 而不是Debug.Assert,因为您还希望在生产环境中检查这些断言。完成后,您可以在生产环境中使用 ProductionTraceListener,在单元测试中使用 UnitTestTraceListener。
public class UnitTestTraceListener : DefaultTraceListener
{
public override void Fail(string message, string detailMessage)
{
string failMessage = message;
if (detailMessage != null)
{
failMessage += " " + detailMessage;
}
// Call to Assert method of used unit testing framework.
Microsoft.VisualStudio.TestTools.UnitTesting.Assert.Fail(
failMessage);
}
}
祝你好运。