Monday, 15 September 2014

unit testing - Can a C# event handler be deferred until after other handlers have been called? -



unit testing - Can a C# event handler be deferred until after other handlers have been called? -

when testing event-driven code in c#, create sure assertions don't execute until after object under test has had chance handle event. currently, using autoresetevent object pause execution until event fired this:

private myclassdependency testobjectdependency = new myclassdependency(); private myclass testobject = new myclass(testobjectdependency); private autoresetevent eventlock = new autoresetevent(false); void handle(object sender, eventargs e) { eventlock.set(); } [test()] public void dosomethingtest() { testobjectdependency.event += handle; testobject.dosomething(); eventlock.waitone(); testobjectdependency.event -= handle; testobject.issomethingdone.should().be.true(); }

while running debugger, set breakpoints in test event handler , in testobject's event handler, , can see test handler fires first, handler i'm trying test begins, , test fails before real handler completes.

how should alter setup handler in test not called until after other handlers have been called? i'm using visual studio 2013, .net 4.0 client, nunit 2.6.3, , should.fluent 1.0.

this question similar this previous one, except here want guarantee other event handlers have completed first.

edit:

thanks few helpful comments, went code , realized problem in test setup. original setup code:

[setup] public void setupdevicecontroller() { dev = new testdevice(); dc = new devicecontroller(dev); dev.read += dev_read; dc.open(); }

a matching dev.read -= dev_read; appears in [teardown] method.

ok, so, glossing on real source of problem when posting illustration code above. in actual test code, have setup method instantiates mock dependency object, injects mock objects dependency real object under test. then, adding test handler mock object before calling real object method adds real handler. real setup code:

[setup] public void setupdevicecontroller() { dev = new testdevice(); dc = new devicecontroller(dev); dev.read += dev_read; dc.open(); }

i changed to:

[setup] public void setupdevicecontroller() { dev = new testdevice(); dc = new devicecontroller(dev); dc.open(); dev.read += dev_read; }

now handlers run in expected order.

c# unit-testing

No comments:

Post a Comment