Teste de unidade de que um evento é gerado em C #, usando reflexão

Quero testar se a configuração de uma determinada propriedade (ou, geralmente, a execução de algum código) gera um determinado evento no meu objeto. Nesse aspecto, meu problema é semelhante aTeste de unidade de que um evento é gerado em C #, mas preciso de muitos desses testes e odeio clichês. Então, eu estou procurando uma solução mais geral, usando reflexão.

Idealmente, eu gostaria de fazer algo assim:

[TestMethod]
public void TestWidth() {
    MyClass myObject = new MyClass();
    AssertRaisesEvent(() => { myObject.Width = 42; }, myObject, "WidthChanged");
}

Para a implementação doAssertRaisesEvent, Eu vim até aqui:

private void AssertRaisesEvent(Action action, object obj, string eventName)
{
    EventInfo eventInfo = obj.GetType().GetEvent(eventName);
    int raisedCount = 0;
    Action incrementer = () => { ++raisedCount; };
    Delegate handler = /* what goes here? */;

    eventInfo.AddEventHandler(obj, handler);
    action.Invoke();
    eventInfo.RemoveEventHandler(obj, handler);

    Assert.AreEqual(1, raisedCount);
}

Como você pode ver, meu problema está na criação de umDelegate do tipo apropriado para este evento. O delegado não deve fazer nada, exceto invocarincrementer.

Devido a todo o xarope sintático em C #, minha noção de como os delegados e os eventos realmente funcionam é um pouco confusa. Esta é também a primeira vez que me refiro à reflexão. Qual é a parte que falta?

questionAnswers(4)

yourAnswerToTheQuestion