我的代码对“应该”正确的数据进行操作。但是在开发过程中,我偶尔会获得无效数据 当发生这种情况时,我想提出调试断言,如果用户选择继续,代码将过滤掉无效记录并继续操作“安全”数据。
// 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
答案 0 :(得分:10)
除了SLaks的回答之外,我想补充一点,你想要做的事情在逻辑上是不一致的。断言应该用于记录不可能是错误的条件。如果出现错误情况,那么你知道你有一个错误;断言的目的是(1)作为一种注释,向读者描述代码中此时必须存在的内容,以及(2)调试辅助工具,告诉您何时有错误。
由于正确的代码中的正确断言从不触发,无法测试断言触发。测试的前提是它可以为您的软件提供可能的配置并验证其正确性;但正确的断言从不的正确代码具有断言触发的配置。
听起来你正在使用Assert来记录你知道的东西是真的,而是希望是真的或者正常的东西真的。不要使用断言。如果程序的任何输入导致断言被违反,那么您需要删除断言,或者在获得无效数据时导致异常,以便断言永远不会看到它。断言是为了记录必须是真的,而不是大部分时间都是如此。
另见相关问题:
答案 1 :(得分:6)
您不应该使用Debug.Assert
。
Debug.Assert
仅用作调试辅助工具
它在发布模式下根本不会被编译。
相反,您应该创建自己的方法,这将向用户显示一个更简单的对话框,并且可以配置为始终继续进行单元测试。 (例如,使用public static bool ShowWarnings
属性)