Проверка выполненного кода обработчика события - PullRequest
3 голосов
/ 20 февраля 2012

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

public class MyClass : MyAbstractClass
{ 
  IFileSystem FileSystem;

  public MyClass(IFileSystem myFileSys)
  {
    FileSystem = myFileSys;
    FileSystem.EventHit += new EventHandler(FileSystem_EventHit);
  }

  public void FileSystem_EventHit(object sender, EventArgs e)
  {
    //Testing base.OnOutput is not possible which I wont go into
    base.OnOutput("EventHit");
  }
}

Код тестирования здесь:

    [Test]
    public void DoSomething_WhenCalled_EventFired()
    {
         var mock = new Moq.Mock<IFileSystem>();

         MyClass plugin = new MyClass (mock.Object);

         mock.Object.DoSomething();

         mock.Raise(x => x.EventHit += null, new EventArgs());

        //Verify/Assert that MyClass handled and did something in the event handler

    }

Ответы [ 5 ]

1 голос
/ 20 февраля 2012

Самый простой способ, который я могу придумать, - это просто добавить свой собственный обработчик в метод теста, чего мне должно хватить?

[Test]
    public void DoSomething_WhenCalled_EventFired()
    {
         var mock = new Moq.Mock<IFileSystem>();
         bool isHit = false;

         mock.EventHit += (s, e) =>
         {
            isHit = true;
         };

         MyClass plugin = new MyClass (mock.Object);

         mock.Object.DoSomething();

         mock.Raise(x => x.EventHit += null, new EventArgs());

         Assert.IsTrue(isHit);

    }
0 голосов
/ 20 февраля 2012

Поскольку проверка чего-либо в обработчике события будет означать попытку тестирования унаследованного кода, я выбрал опцию, чтобы проверить, что событие сработало из конкретного типа, а не фиктивно.

[Test]
public void DoSomething_WhenCalled_EventFired()
{

  FileSystem fs = new FileSystem(mock.Object, timerMock.Object);

  bool WasItHit = false;
  fs.EventHit += delegate { WasItHit = true; };

  fs.DoSomething(); //This should call the event

  Assert.IsTrue(WasItHit);
}
0 голосов
/ 20 февраля 2012

Для этого вам, вероятно, понадобится флаг в MyClass, указывающий, что событие произошло. Я знаю, это будет просто для запуска теста, но иногда хорошо иметь что-то подобное.

0 голосов
/ 20 февраля 2012

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

Попробуйте сформулировать в нескольких словах, что вы пытаетесь проверить, какой тестовый пример.Например,

MyClass переключает состояние в событие State==Hit, в то время как FileSystem.EventHit.

0 голосов
/ 20 февраля 2012

Вам необходимо ввести макет того, что вызывается в результате вызова обработчика событий, и проверить его. Ваш комментарий говорит, что вы не можете проверить базовую базу. OnOutput, но мне кажется, что это именно то, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...