Я хочу проверить, что установка определенного свойства (или, более того, выполнение какого-то кода) вызывает определенное событие на моем объекте. В этом отношении моя проблема аналогична Групповому тестированию, что событие поднято на С#, но мне нужно много этих тестов, и я ненавижу шаблон. Поэтому я ищу более общее решение, используя отражение.
В идеале я хотел бы сделать что-то вроде этого:
[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
.
Из-за синтаксического сиропа в С# мое представление о том, как работают делегаты и события, немного туманно. Это также первый раз, когда я размышляю. Какая недостающая часть?