Guides
Writing Tests
We provide a plugin for testing publisher/subscriber mechanism, eliminating the need for mocks.
- Install the plugin.
- Create a test fixture.
- Write tests.
1. Install the plugin
2. Create a Test Fixture
This involves creating a separate event bus that interacts with the main event bus in your application.
// src/test-fixture/setup-reporter.ts
import { createPlugin } from "@runnel/metric-plugin"; // The new dependency
import { validator } from "@runnel/validator";
import deepEqual from "deep-equal";
import { runnel } from "runneljs";
export function setupReporter() {
const { register, observer } = createPlugin(deepEqual); // Creates a plugin and an observer
// Instantiate another event bus.
const { registerTopic } = runnel("my-event-bus", deepEqual, validator);
register();
return { registerTopic, observer }; // Expose the observer
}
3. Write Tests
Below is a test suite for a simple counter application. The application code is available at Example in React.
// src/App.test.tsx
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
import App from "./App";
import { beforeAll, describe, expect, test, afterAll } from "@jest/globals";
import { setupReporter } from "./test-fixture/setup-reporter";
const { observer } = setupReporter();
describe("App", () => {
let report: any = {};
beforeAll(() => {
// Observe the event bus
observer.subscribe((data) => {
report = data;
});
});
afterAll(() => {
report = {};
});
test("counter increments when button is clicked", async () => {
render(<App />);
const button = screen.getByText("count is 0");
fireEvent.click(button);
await waitFor(() => {
expect(screen.getByText("count is 1")).toBeTruthy();
});
});
test("verifies expected publish/subscribe events", () => {
expect(report).toEqual({
count: { // "count" topic
schema: { type: "number" },
onCreateTopic: 1,
lastPayload: 1,
onPostMessage: 1, // One "publish" action in the code
onAddEventListener: 1, // One "subscribe" action in the code
onRemoveEventListener: 0
},
});
});
});