如何从单元测试(或什至来自同一单元)检查有效的事件处理程序
How to check for valid Event Handlers from a unit test (or even from the same unit)
我多次发现由于某种原因(例如,在表单设计器中复制和粘贴),分配给表单某些组件的事件处理程序丢失了,即事件没有连接到正确的在表格的代码中发挥作用。
我想通过表单代码或某些单元测试来检查:确保它们至少不为空,或者检查它们是否连接到正确的事件处理程序。
我看到了这方面的问题,但是我无法通过错误The event 'SomeEvent' can only appear on the left hand side of += or -=
。当试图将它与 null 进行比较时,或者甚至像其他一些答案所建议的那样,获取代表列表然后检查它们时,就会发生这种情况。
我不是想搅乱这些事件。相反,我想确保它们在我的单元测试中设置正确。
例如,在构造函数中手动将事件处理程序订阅到组件的事件,这对我来说似乎是个坏主意。他们 应该 已经在 InitializeComponent()
代码中订阅了...检查他们是否订阅他们正是我要解决的问题。
我要检查的事件处理程序未在表单本身中定义,即它们不是我的事件处理程序,而是表单或某些组件的事件处理程序。例如,我有一个 Form 的 KeyDown 事件处理程序,用于检查一些快捷方式。尝试获取此类偶数处理程序的 InvocationList 会导致上述错误。
我尽量不依赖设计人员将事件绑定到代码,我更喜欢将它写在我的构造函数中,如果我想将它们组合在一起,则调用 "WireEvents()" 方法
无论如何,如果我理解了你的问题,你可以迭代事件处理程序附加的委托
任何 EventHandler / EventHandler<> 都有一个方法 GetInvocationList(),return 附加事件委托的列表,因此您可以使用它来进行检查
你可以重复做类似的事情
if(YourEvent!=null){
foreach (var @delegate in YourEvent.GetInvocationList()){
//do your job
}
}
更新:
这里的 link 是另一个解决您无法调用 GetInvocationList 的问题的答案:
我多次发现由于某种原因(例如,在表单设计器中复制和粘贴),分配给表单某些组件的事件处理程序丢失了,即事件没有连接到正确的在表格的代码中发挥作用。
我想通过表单代码或某些单元测试来检查:确保它们至少不为空,或者检查它们是否连接到正确的事件处理程序。
我看到了这方面的问题,但是我无法通过错误The event 'SomeEvent' can only appear on the left hand side of += or -=
。当试图将它与 null 进行比较时,或者甚至像其他一些答案所建议的那样,获取代表列表然后检查它们时,就会发生这种情况。
我不是想搅乱这些事件。相反,我想确保它们在我的单元测试中设置正确。
例如,在构造函数中手动将事件处理程序订阅到组件的事件,这对我来说似乎是个坏主意。他们 应该 已经在 InitializeComponent()
代码中订阅了...检查他们是否订阅他们正是我要解决的问题。
我要检查的事件处理程序未在表单本身中定义,即它们不是我的事件处理程序,而是表单或某些组件的事件处理程序。例如,我有一个 Form 的 KeyDown 事件处理程序,用于检查一些快捷方式。尝试获取此类偶数处理程序的 InvocationList 会导致上述错误。
我尽量不依赖设计人员将事件绑定到代码,我更喜欢将它写在我的构造函数中,如果我想将它们组合在一起,则调用 "WireEvents()" 方法
无论如何,如果我理解了你的问题,你可以迭代事件处理程序附加的委托
任何 EventHandler / EventHandler<> 都有一个方法 GetInvocationList(),return 附加事件委托的列表,因此您可以使用它来进行检查
你可以重复做类似的事情
if(YourEvent!=null){
foreach (var @delegate in YourEvent.GetInvocationList()){
//do your job
}
}
更新: 这里的 link 是另一个解决您无法调用 GetInvocationList 的问题的答案: