Boost Node.js Testing with Native Runner and Mocks: BigQuery Example

Chetan Patil
CodeX
Published in
4 min read2 days ago

Master Node.js testing using the native test runner and mock techniques with a practical BigQuery tutorial.

In today’s software development, testing is not just good practice, it’s necessary, in my opinion.

I’m excited to share some valuable insights on testing in Node.js! Through my own experiences, I’ve discovered some practical tips and techniques that I believe will be helpful to the developer community.

Before Node.js 20, developers relied on external testing tools like Jest and Mocha to ensure code quality. These tools provided a robust framework for writing, organizing, and running tests, allowing developers to identify and fix bugs efficiently. Jest and Mocha became essential components of the Node.js development ecosystem, offering a wide range of features such as test suites, assertions, and mocking capabilities. However, integrating and configuring these tools often required additional setup and maintenance, which could be cumbersome for some developers.

With the arrival of Node.js 20, the game changed dramatically. Node.js introduced a built-in test runner, streamlining the testing process by eliminating the need for third-party tools. This built-in test runner simplifies the workflow, making it easier for developers to write and execute tests directly within the Node.js environment. The introduction of this feature marks a significant step forward in enhancing the developer experience and improving code quality.

This tutorial will explore the exciting new world of Node.js’s built-in test runner. We will delve into its powerful features, including the ability to create and use mocks, which are essential for simulating dependencies and isolating units of code for testing. By the end of this tutorial, you’ll have a comprehensive understanding of how to leverage Node.js’s built-in testing capabilities to write effective and efficient tests, ultimately leading to more reliable and maintainable code.

Native Node.Js Test Runner Offers:

  • Simplicity (Easy setup, no extra depenndency)
  • Integration (Seamless integration with Node.js features)
  • Efficiency (Fast execution)

“Node.js’s native test runner simplifies ESM testing and mocking, making it a better choice over Jest for modern projects.”

From Theory to Practice: Mocking BigQuery Calls in Node.Js

We covered fundamentals of Node.Js native test runner, now let’s get our hands dirty with real world scenario.

In this practical example, we’ll walk through how to leverage the node:test module and its mocking capabilities to thoroughly test a Node.js module responsible for interacting with Google BigQuery. We’ll focus on the @google-cloud/bigquery library and demonstrate how to simulate its behavior, ensuring our code is resilient and functions correctly without making any real BigQuery calls during testing.

Creating BigQuery Service

Let’s assume to have task about querying data from BigQuery dataset in stream mode.

In this code, you must have observed export for createBigQueryClient.

Why Export createBigQueryClient?

Wondering why there is such simple function export:

export const createBigQueryClient = () => new BigQuery();

Here’s the reasoning:

Testability: This function is key to easily mocking the BigQuery client in tests. By abstracting the creation of the client, it becomes easy to swap it out for a mock during testing.

Potential Configuration: While not used in this example, imagine needing to pass authentication option or other setting. Having this function makes such future cases easy for implementation without changing core login for query function.

Soften BigQuery with Mocks: The Tests

Testing bigquery.js service directly would require live BigQuery project running, which is costly and not always controllable. Here mocking comes into picture and Node.Js native test runner gives us that functionality in simplest way.

The Power of node:test

Key element

mock.fn(): A powerful tool from node:test to create mock functions. We use it to stub out the createQueryStream method of the BigQuery client.

Mock implementation of createQueryStream simulates data streaming and errors through callbacks.

“Using a table-driven test format helps minimize code duplication and efficiently manage new test scenarios.”

Running the Tests

Executing tests is as simple as running the following command in terminal:

node --test

Node.js will automatically discover and execute test files withing project. The output looks like:

Why Node.Js Native Test Runner?

Built-in Goodness: Embrace the simplicity of using Node.js’s native testing capabilities.

Streamlined Workflow: No need for external dependencies, making your project setup cleaner.

Improved Readability: node:test encourages well-structured tests that are easy to understand and maintain.

Future-Proofing: Align your testing practices with the future of Node.js development.

Time to Test Smarter, Not Harder

This article aimed to introduce you to the Node.js native test runner and demonstrate how to write test functions with straightforward mocking, similar to other testing frameworks. We’ve shown how this built-in feature allows you to create and run tests without needing external tools like Jest or Mocha, simplifying your development workflow.

Give native testing a try in your next project and see how easy it is to write clean, efficient tests with built-in mocking. The streamlined process will enhance the reliability and maintainability of your code, making it easier to catch bugs early and ensure your applications run smoothly.

I’m passionate about learning, sharing and helping developers, so I’ve started a collection of Node.js native test runner examples at TheCodersStudio/node-native-test-runner.

Happy coding!

--

--

Chetan Patil
CodeX
Writer for

Senior Software Engineer @IKEA | Enthusiastic about Technology | GCP | Node.Js | Golang | Java | Terraform