更具体一点:我想要一个单元测试来触发SaveFileDialog的 FileOk 事件,以便测试我自己的代码(包装SFD并在ShowDialog之前和之后做一些额外的事情)是否正常工作意图。
提前感谢您提供任何帮助。
答案 0 :(得分:1)
问题是,事件不会暴露“加注”操作* - 它们暴露“订阅”和“取消订阅”。它取决于实现如何实现订阅/取消订阅。
但是,对于SaveFileDialog
(或任何FileDialog
),OnFileOk
受保护的方法会引发事件。您可以从SafeFileDialog
派生并公开一个公共方法,该方法将调用OnFileOk
或仅使用反射调用OnFileOk
。然后,它将调用FileOk
的事件处理程序。我不确定我是否特别喜欢这些攻击计划中的任何一个,但是如果没有关于你想要做什么的更多信息,我认为我只是回答这个问题而不是过多地质疑:)
*
事实上,.NET本身确实有一个事件的“加注”部分,因此EventInfo.GetRaiseMethod
。但是,这违背了IMO事件的一般概念,而C#编译器从不生成引发部分。我不相信标准库通常会暴露它。
答案 1 :(得分:0)
如果在界面后面隐藏SaveFileDialog,则可以使用存根或模拟实现来测试代码。我不建议在单元测试中使用真实表单或控件,因为它们中的大多数都对活动消息循环具有硬依赖性。
public interface ISaveFileDialog
{
event CancelEventHandler FileOk;
}
public class SaveFileDialogStub : ISaveFileDialog
{
public event CancelEventHandler FileOk;
public void RaiseFileOk(CancelEventArgs e)
{
FileOk(this, e);
}
}
public class ClassUnderTest
{
public ClassUnderTest(ISaveFileDialog dialog)
{
dialog.FileOk += OnFileOk;
}
void OnFileOk(object sender, CancelEventArgs e)
{
//...
}
}
答案 2 :(得分:0)
我相信可以使用PrivateObject在您的课堂上调用私有/受保护的方法。