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?