A class that can be used to generate dynamic events
listeners shall be introduced. Such a class should be able
to dynamically generate an events listener for a given
type.
E.g.: I have a class EventsSource that raises two
events:
event EventHandler1 Event1;
event EventHandler2 Event2;
where EventHandler* declared as:
delegate void EventHandler1(int i);
delegate void EventHandler2(object sender, object args);
So the class (let's call it DynamicListener) can be used
as follows:
EventsSource src = new EventsSource();
DynamicListener listener = new DynamicListener(src);
- or -
DynamicListener listener = new DynamicListener(typeof
(EventsSource)); listener.Listen(src);
listener.Expect("Event1", new IsAnything());
listener.Expect("Event2", new NotNull(), new IsAnything
());
listener.Expect("Event1", 5);
src.DoYourStuff();
listener.Verify();
NOTES:
- DynamicListener might be an IDynamicMock (or
DynamicMock).
- listener.Listen(object source); method is used when
source has not been instantiated yet or can be changed
at run-time.
- ClassGenerator class can be used to generate listener
interface. It would require some minor refactoring to the
class (list of methods to generate needs to be passed as
a parameter, rather then being generated internally the
given type).
- I did not find a method to instantiate delegates at run-
time (when delegate type is not known at compile-time)
using C#. So what I ended up doing is to generate
dynamically methods for registering handlers. My idea is
to create dynamic helper class that will provide methods
for registering listener's (instance of DynamicListener)
methods with events of events source.
The goal is to eliminate code as follows for every event
source to be tested:
public class EventsListener {
public string LastEvent;
public int EventsCount;
public void HandleEvent1(int i) {
++EventsCount;
LastEvent = "HandleEvent1";
}
public void HandleEvent2(object sender, object args) {
++EventsCount;
LastEvent = "HandleEvent2";
}
}
...
EventsListener listener = new EventsListener();
src.Event1 += new Event1Handler
(listener.HandleEvent1);
// etc.
Regards,
Roman V. Gavrilov
Logged In: YES
user_id=397472
Hey Roman,
I am going to work with Choy on implmenting your other
changes in CVS.
Are you going to write this or should we take a stab at it?
-Griffin