aurelia / testing

Simplifies the testing of UI components by providing an elegant, fluent interface for arranging test setups along with a number of runtime debug/test helpers.
MIT License
40 stars 27 forks source link

Handlers called twice because cleanup between tests is late #93

Open RomkeVdMeulen opened 4 years ago

RomkeVdMeulen commented 4 years ago

I'm submitting a bug report

Please tell us about your environment:

Current behavior: When running a lot of tests, every so often I will get errors because an event handler (usually a click handler) that has been registered with click.delegate is called twice. I'm assuming this is because the handler registered in the preceeding test hasn't been cleaned up in time. I'm calling ComponentTester.dispose() in my tear down but it's not enough.

Expected/desired behavior: If a test cannot be reliably cleaned up synchronously, ComponentTester.dispose() should return a promise that resolves when cleanup is complete. Most testing frameworks these days support returning a promise from a tear down and waiting for this to complete.

bigopon commented 4 years ago

This is an issue in vCurrent with EventManager, that we don't have a teardown mechanism in EventManager. Though I think it should be easy to add, could you help with this?

bigopon commented 4 years ago

Maybe the first thing is let's have a look at a repro. Could you help share one?

RomkeVdMeulen commented 4 years ago

The difficulty is that this only seems to occur under heavy load. I'll see if I can put something together that will reliably show the error.

RomkeVdMeulen commented 4 years ago

I've managed to put something together that shows a handler being called multiple times when it shouldn't be. In this case it's caused by aurelia-dialog and not click.delegate, but the principle is the same. I based it on the esnext skeleton since I wanted to base my reproduction on Karma.

https://github.com/RomkeVdMeulen/aurelia-testing-delegate-bug

To reproduce:

npm install
jspm install
gulp test

Note that problems occur in app.spec.js but not counter.spec.js.