4

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

// 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

4

2 回答 2

10

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

由于正确代码中的正确断言永远不会触发,因此无法测试断言触发。测试的前提是它产生您的软件的可能配置并验证其正确性;但是带有正确断言的正确代码永远不会有触发断言的配置。

听起来您使用 Assert 不是为了记录您知道是真实的事情,而是记录您希望是真实的或通常是真实的事情。不要为此使用断言。如果程序有任何输入导致断言被违反,那么您需要删除断言,或者在获取无效数据时引发异常,以便断言永远不会看到它。断言是为了记录什么是真实的,而不是大多数时候是真实的。

另请参阅此相关问题:

Debug.Assert 与异常抛出

于 2011-02-03T15:19:19.860 回答
6

你不应该使用Debug.Assert这个。
Debug.Assert仅用作调试辅助。
在发布模式下根本不会编译它。

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

于 2011-02-03T13:43:20.720 回答