我正在尝试找到在生产代码中使用断言的最佳实践,但我很惊讶我发现的信息很少。
首先,通常可以接受或不在生产代码中使用断言语句吗?
其次,我读到内置的Debug.Assert for .NET实质上会自动禁用生产代码,并且实际上只在开发环境中运行。这是真的,NUnit也内置了这个功能吗?
例如,如果我在生产代码中有以下内容,那么断言会被忽略吗?
var sortedActuals = actuals.OrderByDescending(a =>
{
Assert.That(a.GLPeriodDateTime, Is.Not.Null, "GLPeriodDateTime was null when it should not be");
return a.GLPeriodDateTime.Value;
})
答案 0 :(得分:5)
NUnit Assertions必须在发布版本中运行,因为必须测试发布版本。由于多种原因,您不应在生产代码中包含NUnit断言。
NUnit断言(以及Debug.Assert)旨在检测您的代码中的问题。提供给您的应用程序的错误数据是正常应用程序流程的一部分,应该由您的生产代码检测和处理。
断言旨在在NUnit的控制下运行,NUnit知道结果的含义。例如,某些断言在失败时抛出异常,而其他断言则抛出异常。你需要知道差异才能有效地使用它。
还有其他完善的处理不良数据的方法,包括异常处理,自定义错误消息等。
最有可能的是,您尝试使用与NUnit测试分开的NUnit约束语法。这是一个很好的语法,有几个人要求我们把它作为一个单独的包分开。如果我们这样做了,你可以使用它,但不幸的是我们还没有。
答案 1 :(得分:4)
您不应在生产代码中使用NUnit断言。如果断言失败,NUnit断言总是抛出异常。 NUnit不会检查它是在Debug或Release(Production)中运行。 NUnit断言也被设计为在NUnit测试中使用。
对于实际代码中的断言,您应该使用Debug.Assert
。功能较少,但它会在发布模式下编译出来,因此不会让您的应用在生产中运行崩溃。
答案 2 :(得分:1)
我将从第二个问题开始。不,断言不会被忽视。在C#项目的构建配置中,您可以指定构建忽略DEBUG常量。这就是删除Debug.Assert语句的方式(默认情况下,Visual Studio为您提供了以这种方式设置的构建配置)。
关于你的第一个问题,我想说在生产代码中使用NUnit断言是不可接受的。问问自己,使用断言对异常或其他错误状态有什么好处?
如果GLPeriodDateTime
在用户没有错误的情况下可以为null,则可能需要在发布之前进行更全面的测试才能解决此问题。如果用户有错,则有更好的方法(例如异常)通知用户错误。断言是供开发人员使用的。