© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•12mo ago•
29 replies
[-InsertNameHere-]

✅ Async void method testing in xUnit

In WinForms, it's required to use async void for event handlers like button clicks due to its synchronous nature. However, when trying to test an event handler like the one below, how can I indirectly "await" async void for proper method execution.

Async void method:
  internal async void HandleSubmit_Clicked(object? sender, EventArgs e)
  {
      try
      {     
          bool Valid = await ValidFormAsync(); 
          if (Valid)
          {
              _dataForm.OnSubmissionComplete(this, new SubmissionCompletedEventArgs(_dataForm.GetData(), _dataForm.Mode));
              SubmissionCompleted?.Invoke(this, new SubmissionCompletedEventArgs(_dataForm.GetData(), _dataForm.Mode));
          }
      }
      catch (Exception ex)
      {
          _logger.LogError("Submission Failed due to: {Exception}", ex.Message);
          _dataForm.ShowMessageBox("Submission Failed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
  }

  protected virtual async Task<bool> ValidFormAsync()
  {
      _logger.LogCritical("ValidFormAsync is running in parent. Child must override it.");
      await Task.Delay(100); 
      return true;
  }
  internal async void HandleSubmit_Clicked(object? sender, EventArgs e)
  {
      try
      {     
          bool Valid = await ValidFormAsync(); 
          if (Valid)
          {
              _dataForm.OnSubmissionComplete(this, new SubmissionCompletedEventArgs(_dataForm.GetData(), _dataForm.Mode));
              SubmissionCompleted?.Invoke(this, new SubmissionCompletedEventArgs(_dataForm.GetData(), _dataForm.Mode));
          }
      }
      catch (Exception ex)
      {
          _logger.LogError("Submission Failed due to: {Exception}", ex.Message);
          _dataForm.ShowMessageBox("Submission Failed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
  }

  protected virtual async Task<bool> ValidFormAsync()
  {
      _logger.LogCritical("ValidFormAsync is running in parent. Child must override it.");
      await Task.Delay(100); 
      return true;
  }

The test:
        [Fact]
        public void HandleSubmit_Clicked_RaisesSubmissionCompletedEvent()
        {
            // Arrange
            _presenterTemplate = new DataFormPresenterTemplate(_dataFormTemplate, _testLogger);

            bool eventRaised = false;
            void eventHandler(object? sender, SubmissionCompletedEventArgs args)
            {
                eventRaised = true;
            }
            _presenterTemplate.SubmissionCompleted += eventHandler;

            // Act
            _presenterTemplate.HandleSubmit_Clicked(null, EventArgs.Empty);

            // Assert
            Assert.True(eventRaised);

            // Cleanup
            _presenterTemplate.SubmissionCompleted -= eventHandler;
        }
        [Fact]
        public void HandleSubmit_Clicked_RaisesSubmissionCompletedEvent()
        {
            // Arrange
            _presenterTemplate = new DataFormPresenterTemplate(_dataFormTemplate, _testLogger);

            bool eventRaised = false;
            void eventHandler(object? sender, SubmissionCompletedEventArgs args)
            {
                eventRaised = true;
            }
            _presenterTemplate.SubmissionCompleted += eventHandler;

            // Act
            _presenterTemplate.HandleSubmit_Clicked(null, EventArgs.Empty);

            // Assert
            Assert.True(eventRaised);

            // Cleanup
            _presenterTemplate.SubmissionCompleted -= eventHandler;
        }

Any ideas on how to solve this?
C# banner
C#Join
We are a programming server aimed at coders discussing everything related to C# (CSharp) and .NET.
61,871Members
Resources
Was this page helpful?

Similar Threads

Recent Announcements

Similar Threads

Testing a void method
C#CC# / help
4y ago
async void
C#CC# / help
5mo ago
✅ Weird unit testing issue in xUnit
C#CC# / help
6mo ago