If you find yourself needing to unit test a private method, one solution is to separate that method into its own class, or if it's a pure method, perhaps into a static method that can be tested separately.
This is also helpful when you're dealing with methods called from the UI. In order to test the method through the UI you need some sort of automated integration test. But if you put that same code in a separate class, you can now test it without the UI. Now it's a unit test.
That's one reason why it's beneficial to separate as much application logic as possible from our UI. Writing a unit test that calls a method is easy. Writing an integration test that loads a form and presses a button to invoke exactly the same code is less easy.
I'm not suggesting that we should do this with every private method in every class. If our classes are small enough then we can test everything through the public interface. But by its nature a form is going to invoke all sorts of code, and it wouldn't make sense for tons of it to be in private methods in one form class.
We can move code out of the form using dependency injection, but we can also do it using something simple like this:
private void UrgentBackupButton_Click(object parameter)
{
var doesSomething = new ClassThatDoesSomething();
doesSomething.DoSomething();
}
If the code in the method depends on values it gets from the form or event arguments, you can pass those values to the class, either in its constructor or as method arguments. Wherever possible, pass non-UI types. For example, if the method needs the value of text box, pass that value, not the text box itself.
Once all of that is done, testing the event handler will be less important because it won't actually do anything except call another method in another class, and that method will have unit tests.