reblend-testing-library
Version:
Simple and complete Reblendjs testing utilities that encourage good testing practices.
67 lines • 1.92 kB
JavaScript
import { Reblend } from "reblendjs";
import { render, fireEvent, screen } from "../";
class StopWatch extends Reblend {
initState() {
this.state = {
lapse: 0,
running: false
};
}
handleRunClick() {
this.setState(state => {
if (state.running) {
clearInterval(this.timer);
} else {
const startTime = Date.now() - this.state.lapse;
this.timer = setInterval(() => {
this.setState({
lapse: Date.now() - startTime
});
});
}
return {
running: !state.running
};
});
}
handleClearClick() {
clearInterval(this.timer);
this.setState({
lapse: 0,
running: false
});
}
componentWillUnmount() {
clearInterval(this.timer);
}
html() {
const {
lapse,
running
} = this.state;
return Reblend.construct.bind(this)("div", null, Reblend.construct.bind(this)("span", null, lapse, "ms"), Reblend.construct.bind(this)("button", {
onClick: this.handleRunClick
}, running ? "Stop" : "Start"), Reblend.construct.bind(this)("button", {
onClick: this.handleClearClick
}, "Clear"));
}
}
const sleep = t => new Promise(resolve => setTimeout(resolve, t));
test("unmounts a component", async () => {
const {
unmount,
container,
debug
} = await render(Reblend.construct.bind(this)(StopWatch, null));
//debug(container);
fireEvent.click(screen.getByText("Start"));
await unmount();
// hey there reader! You don't need to have an assertion like this one
// this is just me making sure that the unmount function works.
// You don't need to do this in your apps. Just rely on the fact that this works.
expect(container).toBeEmptyDOMElement();
// just wait to see if the interval is cleared or not
// if it's not, then we'll call setState on an unmounted component
// and get an error.
await sleep(5);
});