2011-02-03 64 views
4

我的代码对“应该”正确的数据进行操作。但是在开发过程中,我有时会收到无效数据。
当发生这种情况时,我想提出调试断言,如果用户选择继续,代码将过滤掉无效记录并继续操作“安全”数据。有没有办法如何从代码Debug.Assert()后继续?

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

回答

6

,则不应使用Debug.Assert这一点。
Debug.Assert仅用作调试帮助。
它在发布模式下根本不会被编译。

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

10

除了SLaks的答案我会补充说,你想要做的是逻辑不一致。断言应该用来记录一个条件,即不可能是错误的。如果出现错误的情况,那么你知道你有一个bug;断言的目的是(1)作为一种评论,向读者描述代码中的这一点必须是真实的;(2)调试助手,告诉你什么时候有bug。

由于正确的断言在正确的代码从未火,没有办法来测试断言射击。测试的前提是它会产生一个可能的软件配置并验证其正确性;但正确的代码与正确的断言从来没有有一个配置的断言触发。

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

又见此相关的问题:

Debug.Assert vs Exception Throwing

相关问题