Модульное тестирование того, что событие вызывается в C # с использованием отражения
Я хочу проверить, что установка определенного свойства (или, в более общем случае, выполнение некоторого кода) вызывает определенное событие в моем объекте. В этом отношении моя проблема похожа наМодульное тестирование, что событие вызывается в C #, но мне нужно много этих тестов, и я ненавижу шаблон. Поэтому я ищу более общее решение, используя рефлексию.
В идеале я хотел бы сделать что-то вроде этого:
[TestMethod]
public void TestWidth() {
MyClass myObject = new MyClass();
AssertRaisesEvent(() => { myObject.Width = 42; }, myObject, "WidthChanged");
}
Для реализацииAssertRaisesEvent
Я зашел так далеко:
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);
}
Как видите, моя проблема заключается в созданииDelegate
соответствующего типа для этого события. Делегат не должен делать ничего, кроме вызоваincrementer
.
Из-за всего синтаксического сиропа в C # мое представление о том, как на самом деле работают делегаты и события, немного смутно. Это также первый раз, когда я балуюсь размышлениями. Какая недостающая часть?