Как программно вызвать событие (запечатанного) компонента Windows Form? - PullRequest
1 голос
/ 01 февраля 2009

Чтобы быть более конкретным: я хочу, чтобы модульный тест вызвал событие FileOk в SaveFileDialog, чтобы проверить, работает ли мой собственный код (который упаковывает SFD и выполняет некоторые дополнительные действия до и после ShowDialog) .

Заранее спасибо за любую помощь в этом.

Ответы [ 3 ]

1 голос
/ 01 февраля 2009

Проблема в том, что события не выставляют операцию "повышения" * - они выставляют "подписаться" и "отписаться". Это зависит от реализации, как они реализуют подписку / отписку.

Однако, в случае SaveFileDialog (или любого FileDialog) есть защищенный метод OnFileOk, который вызовет событие. Вы можете либо получить из SafeFileDialog и предоставить публичный метод, который будет вызывать OnFileOk, либо просто вызвать OnFileOk с помощью отражения. Затем будут вызваны обработчики событий для FileOk. Я не уверен, что мне особенно нравится какой-либо из этих планов атаки, но без дополнительной информации о том, что вы пытаетесь сделать, я подумал, что просто отвечу на вопрос вместо того, чтобы задавать слишком много вопросов:)


* На самом деле, в самом .NET есть идея «поднять» часть события, следовательно, EventInfo.GetRaiseMethod. Однако это идет вразрез с общей идеей события IMO, и компилятор C # никогда не генерирует часть повышения. Я не верю, что стандартные библиотеки обычно это раскрывают.

0 голосов
/ 01 февраля 2009

Я полагаю, что можно использовать PrivateObject для вызова частного / защищенного метода в вашем классе.

0 голосов
/ 01 февраля 2009

Если вы скрываете 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)
    {
        //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...