2013-09-16 8 views
1

У меня есть привязанное поведение, которое подписывается на метод IsVisibleChanged в TabItem. Я хочу написать модульный тест, чтобы убедиться, что это событие подписано в приложенном поведении.Как проверить, было ли событие подписано

Что-то вроде этого:

Assert.IsTrue(myTabItem.IsVisibleChanged != null); 

Я не могу это сделать, потому что мой тест вне класса TabItem поэтому он не может проверить равенство события.

Я также попытался это:

private class MyTabItem : TabItem 
{ 
    public bool IsVisibleChangedNull() 
    { 
     return base.IsVisibleChanged == null; 
    } 
} 

Это также не работает. У кого-нибудь есть хороший способ проверить это?

+0

В этом случае вам может потребоваться использовать рефлексию и проверку белого ящика для доступа к списку подписчиков (поддерживающий делегат). Обратите внимание, что имя поля делегирования поддержки, скорее всего, не 'IsVisibleChanged', вам нужно будет выяснить, что это такое, и возможно найти его в словаре (WinForms использует словари событий в пространственной памяти, не уверен, что WPF также). –

+0

Как в стороне, это действительно то, что требует теста? Это фрагмент кода, который может сломаться, и если это произойдет, не будет ли ошибка сразу очевидной? Я просто никогда не рассматривал тестирование того, что обработчик событий подписан ... Я тестирую свои алгоритмы, сложные вещи. –

+0

@EdS. Это правильный аргумент. Я не был бы разбит сердцем, если бы не смог проверить этот раздел кода. Однако я обычно стараюсь как можно ближе к 100% охвату. – ConditionRacer

ответ

1

Самый простой способ проверить, что событие успешно подписались, чтобы сделать что-то, что будет инициировать событие и иметь код в обработчик событий таким образом, что он должен работать для теста, чтобы добиться успеха:

bool fired = false; 

foo.SomeEvent +=()=> fired = true; 
foo.DoSomethingToFireEvent(); 

Assert.IsTrue(fired); 
+0

Это не говорит вам, правильно ли подключены другие обработчики. –

+0

@BenVoigt Право. Мероприятие подписывается в рамках приложенного поведения, а не модульного теста. – ConditionRacer

+0

@BenVoigt Ну, если они из-за пределов этого теста, я не понимаю, почему они должны. Если они прикреплены в рамках этого теста, вы можете использовать этот метод; вам просто нужно убедиться, что обработчик выполняет некоторый наблюдаемый побочный эффект. – Servy

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