2009-02-01 3 views
1

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

Заранее благодарим за помощь.

ответ

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) 
    { 
     //... 
    } 
} 
+0

Хммм - это будет проверять мой код, но не в сочетании с SFD. Это гарантирует, что я передам правильные значения в диалог, но не будут ли эти значения обрабатываться по назначению. Поскольку SFD делает некоторые вещи под капотом, я предпочел бы фактически сохранить файл и проверить местоположение. – 2009-02-01 14:34:28

+0

Это совсем другой тест. Для написания интеграционных тестов вам, вероятно, нужна какая-то инфраструктура автоматизации, например, White. То, что я пытаюсь сделать, заключается в том, что внутренняя реализация SFD не должна влиять на ваш собственный код; если вы не доверяете SFD, это другое дело :) –

+0

... не должен иметь никакого отношения к * тестированию * ваш собственный код ... –

1

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

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


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

+0

К сожалению, SFD ist запечатан: -/Я предпочел бы расширение для упаковки в любом случае. Класс кнопки предлагает функцию PerformClick(), поэтому реализации в этой точке немного противоречат друг другу. Отражение - хорошее ключевое слово, я попробую (в конце концов, это было бы более прагматично ... – 2009-02-01 18:42:11

+0

... чем интерфейсы и два класса, только для одноблочного теста. Возможно, хорошее место для рефакторинга позже ...) Спасибо. – 2009-02-01 18:43:19

0

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

Смежные вопросы