有没有办法如何从代码中的Debug.Assert()后继续?

时间:2011-02-03 13:38:26

标签: c# unit-testing assertions

我的代码对“应该”正确的数据进行操作。但是在开发过程中,我偶尔会获得无效数据 当发生这种情况时,我想提出调试断言,如果用户选择继续,代码将过滤掉无效记录并继续操作“安全”数据。

// assert incorrect data
Debug.Assert(person.Items.All(item => item.IsValid), "Inconsistent data!");

// operate on filtered data
this.ItemViewModels = new ObservableCollection<ItemViewModel>(
                             person.Items
                                   .Where(i =>item.IsValid) // Use only correct data
                                   .Select(i => new ItemViewModel(lang, i)));

当我选择对过滤后的数据进行操作时,我想对代码路径进行单元测试。

问题:有没有办法在单元测试中通过断言调用?
有些等同于点击“断言失败”对话中的OK=Continue

TIA

2 个答案:

答案 0 :(得分:10)

除了SLaks的回答之外,我想补充一点,你想要做的事情在逻辑上是不一致的。断言应该用于记录不可能是错误的条件。如果出现错误情况,那么你知道你有一个错误;断言的目的是(1)作为一种注释,向读者描述代码中此时必须存在的内容,以及(2)调试辅助工具,告诉您何时有错误。

由于正确的代码中的正确断言从不触发,无法测试断言触发。测试的前提是它可以为您的软件提供可能的配置并验证其正确性;但正确的断言从不的正确代码具有断言触发的配置。

听起来你正在使用Assert来记录你知道的东西是真的,而是希望是真的或者正常的东西真的。不要使用断言。如果程序的任何输入导致断言被违反,那么您需要删除断言,或者在获得无效数据时导致异常,以便断言永远不会看到它。断言是为了记录必须是真的,而不是大部分时间都是如此。

另见相关问题:

Debug.Assert vs Exception Throwing

答案 1 :(得分:6)

您不应该使用Debug.Assert
Debug.Assert仅用作调试辅助工具 它在发布模式下根本不会被编译。

相反,您应该创建自己的方法,这将向用户显示一个更简单的对话框,并且可以配置为始终继续进行单元测试。 (例如,使用public static bool ShowWarnings属性)