2012-02-22 1 views
1

Допустим, у меня есть EventHandler так:Модульное тестирование объект отправителя в EventHandler

public SomethingHappended_Handler(object sender, EventArgs e) 
{ 
    var myobj = sender as MyClass(); 
    myobj.DoSomethingImportant(); 
} 

Как я могу проверить, что myObj это тип MyClass? Я знаю, что отправитель всегда будет иметь MyClass, но я просто подумал, чтобы быть в безопасности я должен был бы: с

if (myObj != null) //Close it 

Если тип не MyClass тогда myObj будет нулевым. Поскольку я знаю, что лучше всего проверить, нет ли этого, как я могу создать единичный тест, чтобы доказать, что если я отправлю другой тип в качестве отправителя, отличного от MyClass, он упадет на вызов DoSomethingImportant, и поэтому мне нужна нулевая проверка?

+1

Что не так со стандартным типом проверки if (myobj == null) ... – Lloyd

+0

@Lloyd Вам все равно нужно отдать отправителя, чтобы он мог называть методы на нем. – Jon

+1

. Вы в основном просите тест, чтобы увидеть «как» делает то, что он должен делать - ИМХО вам не нужно «единичный тест» на уровне того, работает ли C# так, как он документирован. «как» просто не будет передаваться, если объект, который вы пытаетесь выполнить, относится к этому классу или подтипу этого класса. Если вы действительно хотите, просто напишите еще один фрагмент кода, который безопасно использует «как», или проверит тип, используя ключевое слово «is». Или обработчик событий - это всего лишь метод в классе, напишите для него тест, как и любой класс. –

ответ

4

Я могу ответить вам в псевдокоде, чтобы указать, что вы могли бы сделать.

Прежде всего, вы можете проверить, является ли отправитель типа MyClass.

if(sender is MyClass) 

Тогда в вашем UnitTest вы можете отправить в двух фиктивных объектов, один из типа MyClass и один другого типа «MyClassFake». Создайте интерфейс, который использует и реализует метод Close().

Сделать два UnitTests:

  1. Validate, что MyClass.Close() называется.
  2. Подтвердите, что MyClassFake.Close() никогда не вызывается.

Close() - это просто пример, если у вас есть другие методы, вы можете протестировать вызываемые/не вызываемые против них.

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