Как проверить в xunit, что событие было поднято? - PullRequest
1 голос
/ 29 марта 2020

Я определил простое событие в классе, как это

class Request 
{
   protected virtual void OnStateChanged()
   {
      StateChanged?.Invoke(this, EventArgs.Empty);
   }

   public event EventHandler StateChanged;

   public void Approve()
   {
      OnStateChanged();
   }

}

как мне подсчитать, что это событие было вызвано?

Я пробовал реализацию обработчика событий в одну строку

bool eventRaised = false;
request.StateChanged += (obj, eventArgs) => eventRaised = true;
request.Approve();
Assert.True(eventRaised);

это работает, но есть ли лучший подход? Я не разобрался, как пользоваться Assert.Raises()

1 Ответ

1 голос
/ 29 марта 2020

Это наиболее рекомендуемый подход

Однако в следующем примере показано, как использовать Assert.Raises() для проверки события вашего предоставленного класса

var request = new Request();

var evt = Assert.Raises<EventArgs>(
    h => request.StateChanged += h,
    h => request.StateChanged -= h,
    () => request.Approve());

Assert.NotNull(evt);
Assert.Equal(request, evt.Sender);
Assert.Equal(EventArgs.Empty, evt.Arguments);

Однако вашему обработчику событий потребуется быть обобщенным c делегатом

public event EventHandler<EventArgs> StateChanged;

вместо просто EventHandler, чтобы Assert.Raises работал должным образом.

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