如何以编程方式触发(密封)Windows窗体组件的事件?

时间:2009-02-01 13:44:53

标签: c# events triggers

更具体一点:我想要一个单元测试来触发SaveFileDialog的 FileOk 事件,以便测试我自己的代码(包装SFD并在ShowDialog之前和之后做一些额外的事情)是否正常工作意图。

提前感谢您提供任何帮助。

3 个答案:

答案 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在您的课堂上调用私有/受保护的方法。