-
Notifications
You must be signed in to change notification settings - Fork 19
Description
Hi!
I've been able to run ember-cli-fastboot-testing with ember-mocha.
Unfortunately, yarn link breaks the app for me, so I wasn't able to make a PR quickly. Also, I used a weird hack. Hopefully, you'll be able to find a better solution.
When porting the test file to Mocha, I ran into two issues.
-
ember-mocharequires running a setup helper. It has a few to offer, and every one of them runssetupContextandteardownContext. Since running those twice crashes the test pipeline,ember-cli-fastboot-testingcan't be used, so I had to make my own withoutsetupContextandteardownContext. -
My tests started passing, but the test pipeline crashed on teardown after all tests. The error was from inside Glimmer, where it was doing something like
parent.remove(child)and crashing with "this child does not belong to this parent".I was able to identify the parent as the testing container. The child turned out to be the application div inside the container, that happens to be there before
visitfromember-cli-fastboot-testingis called.I managed to fix the issue with a weird workaround. In the before hook, I remove the content of the test container and stash it. In the after hook, I put it back! It feels like an ugly hack 🙈, but it did unblock
ember-cli-fastboot-testingfor me.
So here's my setup helper that enables ember-cli-fastboot-testing to be used with ember-mocha:
import { mockServer } from 'ember-cli-fastboot-testing/test-support';
import getRootElement from '@ember/test-helpers/dom/get-root-element';
export function setupMockServer(hooks) {
let children;
hooks.beforeEach(async function() {
await mockServer.cleanUp();
children = removeChildrenFromParent();
});
hooks.afterEach(async function() {
await mockServer.cleanUp();
removeChildrenFromParent();
restoreChildrenToParent(children);
});
}
function removeChildrenFromParent(parent = getRootElement()) {
const children = [];
while (parent.firstChild) {
children.push(parent.firstChild);
parent.removeChild(parent.firstChild);
}
return children;
}
function restoreChildrenToParent(children, parent = getRootElement()) {
children.forEach(child => {
parent.appendChild(child);
})
}